我正在尝试将SDL库添加到我的第三方列表中。为此,我创建了包含以下内容的CMakeLists.txt文件:
CMAKE_MINIMUM_REQUIRED(VERSION 3.1.3)
project(TestProject)
ADD_EXECUTABLE(test_project index.cpp)
INCLUDE_DIRECTORIES (3dparty/sdl/include)
ADD_SUBDIRECTORY(3dparty/sdl EXCLUDE_FROM_ALL)
TARGET_LINK_LIBRARIES(test_project general SDL2)
TARGET_LINK_LIBRARIES(test_project general SDL2main)
TARGET_LINK_LIBRARIES(test_project debug SDL2)
TARGET_LINK_LIBRARIES(test_project debug SDL2main)当我生成VS13项目时,其目标()的SLD链接出现在目标"test_project“中。test_project目标中的链接库列表:
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib
3dparty\sdl\Debug\SDL2main.lib
3dparty\sdl\Debug\SDL2.lib
winmm.lib
imm32.lib
version.lib
dinput8.lib
dxguid.lib
dxerr.lib但应该是这样的:
3dparty\sdl\Debug\SDL2main.lib
3dparty\sdl\Debug\SDL2.lib在目标"test_project“中,我没有包含DirectX SDK库的路径。因此,链接器告诉我:
LINK : fatal error LNK1104: cannot open file 'dxerr.lib'发布于 2015-05-21 16:26:57
这是一个特性。CMake transitively passes on public link dependencies.
也就是说,如果SDL具有到dxerr.lib的公共链接依赖项,那么将具有任何链接到SDL的可执行文件。
我现在看到了两种可能性:要么SDL在他们的构建脚本中有一个bug,要么错误地将一个库声明为公共依赖,而它应该是私有的。或者确实存在需要由可执行文件解决的合法依赖项。
例如,后者适用于将SDL构建为静态库而不是DLL的情况。请记住,静态库不会通过链接器传递,这意味着静态库的所有依赖项都会传递给链接它们的可执行文件或DLL。
发布于 2015-05-22 04:21:02
在ComicSansMS的改进之后,我在SDL源文件的CMakeLists.txt文件中将"LINK_PRIVATE“放入target_link_libraries中,现在它可以工作了。
https://stackoverflow.com/questions/30355763
复制相似问题