KhronosGroup / KhronosGroup/Vulkan-Hpp
Installed target Vulkan::HppModule doesn't link
- Dominant language
- C++
- Stars
- 3.8k
- Forks
- 374
- Avg merge
- 23h 4m
- Merged PRs (30d)
- 32
Description
cmake: nightly 4.4.20260622-gd0b1ac7 and release 4.3.4
os: windows 11
compiler: clang msys64 (clang64 env)
When I install Vulkan-Headers I get such cmake config file:
```cmake
...
# Create imported target Vulkan::HppModule
add_library(Vulkan::HppModule INTERFACE IMPORTED)
set_target_properties(Vulkan::HppModule PROPERTIES
CXX_EXTENSIONS "OFF"
CXX_MODULE_STD "ON"
IMPORTED_CXX_MODULES_COMPILE_FEATURES "cxx_std_23"
IMPORTED_CXX_MODULES_LINK_LIBRARIES "Vulkan::Headers"
INTERFACE_COMPILE_FEATURES "cxx_std_23"
INTERFACE_LINK_LIBRARIES "Vulkan::Headers"
)
if(NOT CMAKE_VERSION VERSION_LESS "3.28.0")
target_sources(Vulkan::HppModule
INTERFACE
FILE_SET "CXX_MODULES"
TYPE "CXX_MODULES"
BASE_DIRS "${_IMPORT_PREFIX}/include"
FILES "${_IMPORT_PREFIX}/include/vulkan/vulkan.cppm" "${_IMPORT_PREFIX}/include/vulkan/vulkan_video.cppm"
)
...
```
When I do `target_link_libraries(${PROJECT_NAME} Vulkan::HppModule)`, I get linker errors:
CMD
```bash
[18/18] Linking CXX executable test.exe
FAILED: [code=1] test.exe
C:\WINDOWS\system32\cmd.exe /C "cd . && C:\msys64\clang64\bin\clang++.exe -m64 -stdlib=libc++ -g -m64 CMakeFiles/test.dir/src/math.cppm.obj CMakeFiles/test.dir/src/main.cpp.obj CMakeFiles/test.dir/src/math.cpp.obj -o test.exe -Wl,--out-implib,libtest.dll.a -Wl,--major-image-version,0,--minor-image-version,0 lib@cmake_cxx_std.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
ld.lld: error: undefined symbol: vk::raii::Context@vulkan::Context()
>>> referenced by C:/Users/aaall/repos/test/src/main.cpp:4
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::raii::Instance@vulkan::Instance(vk::raii::Context@vulkan const&, vk::InstanceCreateInfo@vulkan const&, vk::Optional@vulkan)
>>> referenced by C:/Users/aaall/repos/test/src/main.cpp:9
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::raii::Instance@vulkan::getDispatcher() const
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan_raii.hpp:15890
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan_raii.hpp:15897
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan_raii.hpp:15901
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::Instance@vulkan::operator VkInstance_T*() const
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan_raii.hpp:15897
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan_raii.hpp:15902
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::OutOfHostMemoryError@vulkan::OutOfHostMemoryError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8904
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8904
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::OutOfDeviceMemoryError@vulkan::OutOfDeviceMemoryError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8905
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8905
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::InitializationFailedError@vulkan::InitializationFailedError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8906
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8906
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::DeviceLostError@vulkan::DeviceLostError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8907
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8907
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::MemoryMapFailedError@vulkan::MemoryMapFailedError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8908
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8908
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::LayerNotPresentError@vulkan::LayerNotPresentError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8909
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8909
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::ExtensionNotPresentError@vulkan::ExtensionNotPresentError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8910
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8910
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::FeatureNotPresentError@vulkan::FeatureNotPresentError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8911
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8911
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::IncompatibleDriverError@vulkan::IncompatibleDriverError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8912
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8912
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::TooManyObjectsError@vulkan::TooManyObjectsError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8913
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8913
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::FormatNotSupportedError@vulkan::FormatNotSupportedError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8914
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8914
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::FragmentedPoolError@vulkan::FragmentedPoolError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8915
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8915
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::UnknownError@vulkan::UnknownError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8916
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8916
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::ValidationFailedError@vulkan::ValidationFailedError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8917
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8917
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::OutOfPoolMemoryError@vulkan::OutOfPoolMemoryError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8918
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8918
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: undefined symbol: vk::InvalidExternalHandleError@vulkan::InvalidExternalHandleError(char const*)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8919
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
>>> referenced by C:/Users/aaall/.conan2/p/b/vulkac640f8e93e6b9/p/include/vulkan/vulkan.hpp:8919
>>> CMakeFiles/test.dir/src/main.cpp.obj:(main)
ld.lld: error: too many errors emitted, stopping now (use --error-limit=0 to see all errors)
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
```
I don't know why, but cmake completely ignores `target_source(INTEFRACE)` with cxx modules.
To fix it you need to make target type `OBJECT` by add `OBJECTS DESTINATION`:
```diff
install(TARGETS Vulkan-HppModule
EXPORT VulkanHeadersConfig
+ OBJECTS DESTINATION ${CMAKE_INSTALL_LIBDIR}
FILE_SET CXX_MODULES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
```
but I'm not sure is it proper fix or not
cmake project
```cmake
cmake_minimum_required(VERSION 4.4)
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD f35a9ac6-8463-4d38-8eec-5d6008153e7d)
project(test)
set(CMAKE_CXX_MODULE_STD ON)
add_executable(${PROJECT_NAME})
target_sources(${PROJECT_NAME} PRIVATE
FILE_SET SOURCES
FILES
src/main.cpp
src/math.cpp
FILE_SET CXX_MODULES
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src
FILES
src/math.cppm
)
add_compile_definitions(VK_USE_PLATFORM_WIN32_KHR)
add_compile_options(-Wno-reserved-module-identifier)
find_package(VulkanHeaders CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} Vulkan::HppModule)
```
```cpp
// main.cpp
import vulkan;
int main(int argc, char* argv[]) {
vk::raii::Context context;
vk::ApplicationInfo appInfo;
appInfo.setApiVersion(vk::makeApiVersion(1, 0, 0, 0));
vk::InstanceCreateInfo instanceCreateInfo;
instanceCreateInfo.setPApplicationInfo(&appInfo);
vk::raii::Instance instance { context, instanceCreateInfo };
auto physical_devices = instance.enumeratePhysicalDevices();
vk::PhysicalDeviceProperties properties = physical_devices[0].getProperties();
std::println("Hello. Device name is {}", std::string_view { properties.deviceName });
vk::DeviceCreateInfo deviceCreateInfo;
vk::raii::Device device = physical_devices[0].createDevice(deviceCreateInfo);
}
```
```cpp
// math.cppm
module;
export module math;
export int secret_compute(int x);
export int public_compute(int x);
module : private;
int internal_helper(int x) {
return x * 42;
}
int public_compute(int x) {
if (x <= 0) return 0;
return secret_compute(x) + 7;
}
```
```cpp
// math.cpp
module;
export module math;
export int secret_compute(int x);
export int public_compute(int x);
module : private;
int internal_helper(int x) {
return x * 42;
}
int public_compute(int x) {
if (x <= 0) return 0;
return secret_compute(x) + 7;
}
```
Contributor guide
Research direction
Start with the Vulkan-HppModule install(TARGETS Vulkan-HppModule) block and the generated VulkanHeadersConfig shown in the issue. Reproduce the failure with the supplied minimal CMake project and inspect the generated target and link command; done means an installed Vulkan::HppModule links successfully and the sample builds without undefined symbols.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cmake, cpp
- Domain
- build-system
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 58/100