CMake到外部库的链接
如何让CMake将可执行文件链接到不在同一CMake项目中生成的外部共享库 只需执行CMake到外部库的链接,cmake,Cmake,如何让CMake将可执行文件链接到不在同一CMake项目中生成的外部共享库 只需执行target\u link\u库(GLBall${CMAKE\u BINARY\u DIR}/res/mylib.so)就会产生错误 make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'. Stop. make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2 make: *** [al
target\u link\u库(GLBall${CMAKE\u BINARY\u DIR}/res/mylib.so)
就会产生错误
make[2]: *** No rule to make target `res/mylib.so', needed by `GLBall'. Stop.
make[1]: *** [CMakeFiles/GLBall.dir/all] Error 2
make: *** [all] Error 2
(GLBall is the executable)
在我将库复制到二进制目录bin/res
之后
我尝试使用find_库(结果mylib.so路径${CMAKE_BINARY_DIR}/res)
如果
RESULT-NOTFOUND
,首先设置库搜索路径,则失败:
LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res)
然后就这么做
TARGET_LINK_LIBRARIES(GLBall mylib)
首先设置库搜索路径:
LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/res)
然后就这么做
TARGET_LINK_LIBRARIES(GLBall mylib)
arrowdodger的回答是正确的,在很多情况下都是首选。我只想在他的回答之外再加上一条: 您可以添加“导入的”库目标,而不是链接目录。比如:
# Your-external "mylib", add GLOBAL if the imported library is located in directories above the current.
add_library( mylib SHARED IMPORTED )
# You can define two import-locations: one for debug and one for release.
set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/res/mylib.so )
然后链接,就像此库是由您的项目构建的一样:
TARGET_LINK_LIBRARIES(GLBall mylib)
这样的方法会给您更多的灵活性:看看命令和命令
我不知道这是否能解决“libs更新版本”的问题。arrowdodger的答案是正确的,并且在很多情况下是首选的。我只想在他的回答之外再加上一条: 您可以添加“导入的”库目标,而不是链接目录。比如:
# Your-external "mylib", add GLOBAL if the imported library is located in directories above the current.
add_library( mylib SHARED IMPORTED )
# You can define two import-locations: one for debug and one for release.
set_target_properties( mylib PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/res/mylib.so )
然后链接,就像此库是由您的项目构建的一样:
TARGET_LINK_LIBRARIES(GLBall mylib)
这样的方法会给您更多的灵活性:看看命令和命令
我不知道这是否能解决“更新版本的libs”的问题。如果您正在使用Appstore,则需要“授权”,因此需要与Apple框架链接 要获得工作授权(例如GameCenter),您需要有一个“链接二进制文件与库”-buildstep,然后链接到“GameKit.framework”。CMake将“低级”库“注入”到命令行中,因此Xcode并不真正了解它,因此您不会在功能屏幕中启用GameKit 使用CMake并拥有“与二进制文件的链接”的一种方法——构建步骤是使用CMake生成xcodeproj,然后使用“sed”来“搜索和替换”,并以XCode喜欢的方式添加游戏套件 脚本如下所示(对于Xcode 6.3.1) 将其保存到“gamecenter.sed”,然后像这样“应用”它(它会更改您的xcodeproj!) 您可能需要更改脚本命令以满足需要 警告:由于项目格式可能发生变化,它可能会与不同的Xcode版本中断,(硬编码的)唯一编号可能不是唯一的-通常其他人的解决方案更好-因此,除非您需要支持Appstore+授权(和自动构建),否则不要这样做
这是一个CMake bug,请参见和另一个选择,如果您使用Appstore,则需要“授权”,因此需要与Apple框架链接 要获得工作授权(例如GameCenter),您需要有一个“链接二进制文件与库”-buildstep,然后链接到“GameKit.framework”。CMake将“低级”库“注入”到命令行中,因此Xcode并不真正了解它,因此您不会在功能屏幕中启用GameKit 使用CMake并拥有“与二进制文件的链接”的一种方法——构建步骤是使用CMake生成xcodeproj,然后使用“sed”来“搜索和替换”,并以XCode喜欢的方式添加游戏套件 脚本如下所示(对于Xcode 6.3.1) 将其保存到“gamecenter.sed”,然后像这样“应用”它(它会更改您的xcodeproj!) 您可能需要更改脚本命令以满足需要 警告:由于项目格式可能发生变化,它可能会与不同的Xcode版本中断,(硬编码的)唯一编号可能不是唯一的-通常其他人的解决方案更好-因此,除非您需要支持Appstore+授权(和自动构建),否则不要这样做
这是一个CMake bug,请参见和我假设您想链接到一个名为foo的库,它的文件名通常是link
foo.dll
或libfoo.so
1。查找库你必须找到图书馆。这是一个好主意,即使你知道去图书馆的路。如果库消失或获得新名称,则CMake将出错。这有助于及早发现错误,并让用户(可能自己)清楚问题的原因。
要查找库foo并将路径存储在
foo_LIB
中,请使用
find_library(FOO_LIB foo)
CMake将自行确定实际的文件名。它检查通常的位置,如/usr/lib
,/usr/lib64
和路径中的路径
您已经知道库的位置。当您调用CMAKE时,将其添加到CMAKE\u PREFIX\u路径
,那么CMAKE也会在传递的路径中查找您的库
有时需要添加提示或路径后缀,有关详细信息,请参阅文档:
2。链接库
从1。您在FOO_LIB
中有完整的库名。您可以使用它将库链接到目标GLBall
,如中所示
target_link_libraries(GLBall PRIVATE "${FOO_LIB}")
您应该在目标后添加PRIVATE
、PUBLIC
或INTERFACE
,参见文档:
如果不添加这些可见性说明符中的任何一个,它的行为将类似于PRIVATE
或PUBLIC
,具体取决于CMake版本和策略集
3。添加包含项(此步骤可能不是强制性的)。
如果还希望包含头文件,请使用类似于查找库
的查找路径
并搜索头文件。然后添加带有target\u include\u目录的include目录
,类似于target\u link\u库
文件:
和
如果外部软件可用,您可以更换f
target_link_directories(GLBall PUBLIC "/path/to/lib/directory")
target_link_libraries(GLBall mylib)