【问题标题】:how do i specify libraries's path to cmake which are used by target_link_libraries如何指定 target_link_libraries 使用的库的 cmake 路径
【发布时间】:2019-11-15 19:34:04
【问题描述】:

我有一些具有cmake 构建系统的代码库。在构建 iam 时出现如下错误

/usr/bin/ld: cannot find -lcurl

下面是示例cmakelist.txt

cmake_minimum_required(VERSION 2.8.6)
project(oci_object_test)

set(IB_HOME /home/user/sample_cmake/usr/lib)

include_directories(${LIB_HOME}/include)
link_directories(${LIB_HOME}/lib64)

link_directories(/home/user/sample_cmake/usr/lib/lib64)
link_directories(/home/user/)

set(SOURCES
        sample.cpp
)

add_executable(demo ${SOURCES})
target_link_libraries(demo curl openssl) 

上面的cmakelist.txt下面是cmake生成的link.txt

/usr/bin/c++      CMakeFiles/demo.dir/sample.cpp.o  -o demo  -L/home/user/sample_cmake/usr/lib/lib64  -L/home/user -rdynamic -lcurl -lopenssl -Wl,-rpath,/home/user/sample_cmake/usr/lib/lib64:/home/user 

这个问题是由于 -lcurl 被添加到 cmake 生成的 link.txt 中。如果我手动从link.txt 中删除-lcurl 并构建,构建将成功且没有链接器错误。那么有什么方法可以让我在link.txt 中摆脱这个-lcurl,或者是否可以在实际存在libcurl 的位置定义-lcurl 路径(例如,假设libcurl 存在于/usr/curl_path/curl 中)以便cmake 可以生成链接。 txt如下?

/usr/bin/c++      CMakeFiles/demo.dir/sample.cpp.o  -o demo  -L/home/user/sample_cmake/usr/lib/lib64  -L/home/user -rdynamic /usr/curl_path/curl -lopenssl -Wl,-rpath,/home/user/sample_cmake/usr/lib/lib64:/home/user 

我知道我可以直接定义libucrl 路径如下,这将解决我的问题,

target_link_libraries(demo /usr/curl_path/curl openssl) 

但我正在寻找类似SET 或任何其他cmake environment variable 之类的东西,我可以在 toolchain.cmake 文件中定义它们,这样cmakelist.txt 就不会被触及,in simple words how do i specify those libraries's path to cmake which are going use inside target_link_libraries

【问题讨论】:

  • 您必须查看 CMakeLists.txt 文件以查看 curl 库的链接位置。在 CMake 文件中查找 link_libraries()target_link_libraries() 命令,这些命令可能包含 curl-lcurl。如果没有看到 CMake 文件本身,很难提出任何明确的建议......
  • @squareskittles 我已经添加了示例 cmakelist.txt 和问题的完整描述,请查看它
  • CMake 不会自动将 libcurl(或任何其他库)链接到您的程序。您在 CMakeLists.txt 的某处有(或有)链接此库的请求。简而言之:@squareskittles 是对的。您可以展示完整的 cmake 脚本,也可以自行查找。
  • 如何指定 target_link_libraries 使用的库的 cmake 路径?

标签: cmake linker libcurl ld


【解决方案1】:

如果您的 CMake 版本低于 3.12,则需要使用这种旧方法。看: https://cmake.org/cmake/help/v3.10/module/FindCURL.html

cmake_minimum_required(VERSION 3.10)
project(program)

find_package(CURL REQUIRED)

if (CURL_FOUND)
    add_executable(program main.cpp)
    target_link_libraries(program ${CURL_LIBRARIES})
    target_include_directories(program PRIVATE ${CURL_INCLUDE_DIRS})
endif()

CMake 3.12 及更高版本有一种使用导入目标的新方法。请参阅新的替代方案FindCurl

cmake_minimum_required(VERSION 3.12)
project(program)

find_package(CURL REQUIRED)

if (CURL_FOUND)
    add_executable(program main.cpp)
    target_link_libraries(program CURL::libcurl)
endif()

【讨论】:

    【解决方案2】:

    我发现这个问题可以通过两种方法解决(第一种方法类似于this

    第二种方法是在调用target_link_directories之前在cmakelist.txt文件中添加以下两行代码

    add_library( curl SHARED IMPORTED)
    set_property(TARGET curl PROPERTY IMPORTED_LOCATION "${CURL_LIBRARY}")
    

    其中CURL_LIBRARYlibcurl.sotoolchain.cmake 中指定的路径 不幸的是我没有找到任何解决方案来解决这个问题而不接触cmakelist.txt

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 2013-06-20
      • 2018-09-23
      • 1970-01-01
      • 2013-07-02
      • 2021-12-05
      • 2011-07-24
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多