代码之家  ›  专栏  ›  技术社区  ›  phemmer

CMake target_link_库转换路径导致链接器“未找到”错误

  •  0
  • phemmer  · 技术社区  · 2 年前

    我正在使用CMake为外部应用程序构建一个模块。作为构建的一部分,我还将生成一个可执行文件,该文件链接模块以运行测试。但是,作为外部应用程序的模块约定的一部分,模块名称不应具有 lib 前缀这将导致以下结果: CMakeLists.txt :

    add_library(mymodule SHARED mymodule.c)
    set_target_properties(mymodule PROPERTIES PREFIX "")
    
    add_executable(mytest mytest.c)
    target_link_libraries(mytest ${CMAKE_BINARY_DIR}/mymodule.so)
    

    构建时,CMake正在将路径转换为搜索名称,这会导致错误:

    /usr/bin/ld: cannot find -lmymodule
    

    如果我跑 cmake . 之后再次(没有任何改变) mymodule.so 一旦建成,它就不再使用 -lmymodule 我的模块。所以 ,而且有效。如果我移除 PROPERTIES PREFIX "" ,它也有效。

    因为我指定了 我的模块。所以 内部路径 target_link_libraries() ,如何让CMake停止将其转换为搜索名称( -lmymodule )?

    1 回复  |  直到 2 年前
        1
  •  2
  •   ixSci    2 年前

    如果目标是你项目的一部分,你应该链接目标,而不是文件。在你的情况下是这样的 target_link_libraries(mytest mymodule) .

    但是,如果出于某种原因需要链接到完整路径,那么CMake有一些特性,这些特性在 docs .因此,在您的情况下,它将完整路径转换为 -lmymodule 因为如果提供给库的完整路径不正确,这是CMake展示的行为 soname .