我在mac机上编写了一些代码并且它已经完美运行但是当我将它移植到Linux机器上时我得到了undefined reference to curl_easy_init
我的编译器标志包含-lcurl
用于链接。
以下是我的链接方式:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -L/curl/lib/dir -lcurl")
我尝试使用和不使用-L/curl/lib/dir
此机器上安装了Curl:
$ curl --version
curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets
答案 0 :(得分:4)
从不将-l
标记添加到 CMAKE_EXE_LINKER_FLAGS ,而且还添加到 CMAKE_CXX_FLAGS (标记-l
用于< em> linker ,而不是编译器)。
对于与库的链接,使用target_link_libraries:它专门用于此目的:
target_link_libraries(<your-executable> curl)
向*_FLAGS
变量添加标志时,标志会在链接器命令行中的源文件(实际上是对象文件)之前添加。如果源文件使用库中的某些函数,则链接器无法找到它。
相反,命令target_link_libraries
生成的标志在链接器命令行中的源文件之后添加。