我有一些具有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
此问题是由于cmake生成的-lcurl
中添加了link.txt
。如果我手动从-lcurl
中删除link.txt
并进行构建,则构建将成功,并且不会出现链接器错误。因此,有什么办法可以摆脱-lcurl
中的link.txt
,还是可以定义实际存在libcurl的-lcurl路径(例如,假设存在于/usr/curl_path/curl
内部的libcurl),以便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)
但是我正在寻找可以在toolchain.cmake文件中定义的类似SET
或任何其他cmake environment variable
的东西,以便使cmakelist.txt
不受影响,in simple words how do i specify those libraries's path to cmake which are going use inside target_link_libraries
如果您的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()