CMake SDL和add_subdirectory

时间:2015-05-20 16:46:51

标签: cmake directx sdl

我试图将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'

2 个答案:

答案 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中,现在可以正常工作。