我试图将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项目时,libs(其目标()的SLD链接发生在target" 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'
答案 0 :(得分:2)
这是一项功能。 CMake transitively passes on public link dependencies.
也就是说,如果SDL与dxerr.lib
具有公共链接依赖关系,那么将有任何链接到SDL的可执行文件。
我现在看到两种可能性:SDL在构建脚本中有一个错误,并且当它应该是私有时,错误地将库声明为公共依赖项。或者确实存在需要由可执行文件解决的合法依赖项。
例如,如果您将SDL构建为静态库而不是DLL,则后者将成立。请记住,静态库不会通过链接器,这意味着静态库的所有依赖项都会传递给链接它们的可执行文件或DLL。
答案 1 :(得分:0)
在ComicSansMS推进之后,我将“LINK_PRIVATE”放在SDL源中的CMakeLists.txt文件中的target_link_libraries中,现在可以正常工作。