我在一个主项目上工作,有几个第三方库。我的目标是为了清楚起见将所有这些作为导入目标导入,但我无法使用它。它基本上是一组静态库( .lib / lib .a)及其标题。
为了便于讨论,Main是主要目标,第三是进口第三方。
我设法在Windows上生成一个合适的Visual Studio解决方案,但事情并没有按照预期在Linux上运行。在构建解决方案时,我最终得到了这个错误:
"No rule to make target 'Third-NOTFOUND', needed by '../Bin/Main'"
以下是我的CMakeLists.txt的一些代码段。
主要的CMakeLists.txt:
project(Main)
[...]
add_subdirectory(ThirdParty/Third)
set_property(TARGET Third PROPERTY FOLDER "thirdparty")
[...]
add_executable(Main ${SOURCES})
target_link_libraries(Main PRIVATE Third)
Third's CMakeLists.txt:
project(Third)
[...]
# Helper function
function(append_lib target lib_debug_dir lib_release_dir name)
set_property(TARGET ${target} APPEND PROPERTY IMPORTED_LOCATION_DEBUG "${lib_debug_dir}/${LIB_NAME}")
set_property(TARGET ${target} APPEND PROPERTY IMPORTED_LOCATION_RELEASE "${lib_release_dir}/${LIB_NAME}")
endfunction()
[...]
add_library(Third STATIC IMPORTED GLOBAL)
set_property(TARGET Third APPEND PROPERTY PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${INCLUDE_DIR}")
append_lib(Third ${LIB_DIR_DEBUG} ${LIB_DIR_RELEASE} libMyLib1.a)
注意:Linux和Windows的代码是相同的,除了它自己的静态库的名称(MyLib1.lib替换libMyLib1.a)
我做错了什么?谢谢:))
答案 0 :(得分:2)
我终于设法得到了我想要的东西,即使我找不到一种方法来获得适用于两个系统的方法。
在Windows上,我坚持我在问题中描述的内容。
但是在Linux上,我找到了一些解决方法。我将一个库导入为IMPORTED_LOCATION,将所有其他库导入为INTERFACE_LINK_LIBRARIES。这不是很好,但如果我没有指定导入的位置,我会收到第三次NOTFOUND错误。
正如Antonio所说,我使用CMAKE_BUILD_TYPE链接不同配置的不同库。
谢谢你们的帮助!
答案 1 :(得分:0)
如果它在Windows中而不是在Unix中运行,那很可能是因为路径大小写:即,在文件夹名称中使用大写和小写字符不一致。这在Windows中是可以容忍的,但在Unix中无情地受到惩罚:)
解决方案:检查您在项目周围拼写thirdparty
的方式(在此处,我看到thirdparty
和ThirdParty
)。