此时报了一个链接不存在的错误,但看ld文件,通过-L指定相关路径,-l指定相关包,如何解决?

百度,GPT,Google相关的搜索均已尝试,麻烦GPT,百度类似的答案不要回答。
在对C++进行开发过程中,用conan去构建项目,在CMakeList.txt引入该conan自动生成的conanbuildinfo.cmake,如下:

include(build/conanbuildinfo.cmake)
conan_basic_setup(KEEP_RPATHS)

并且通过以下命令

cd build
cmake ..
make 

此时报了一个链接不存在的错误,但看连接文件,通过-L指定相关路径,-l指定相关包,但是依旧链接不存在,错误如下:

img

但相关的通过cmake生成的连接的编译命令是可以的,大致如下:

c++  -fPIC  -isysroot -L/Users/admin/.conan/data/abseil/20230125.1/_/_/package/1aff124b71f6d938138ecd7179ff075f4304a85d/lib -labsl_failure_signal_handler 

报错为连接不存在,但这里我直接改成绝对地址就行的

c++  -fPIC  -isysroot /Users/admin/.conan/data/abseil/20230125.1/_/_/package/1aff124b71f6d938138ecd7179ff075f4304a85d/lib/libabsl_failure_signal_handler.a

当前路径不对,使用相对路径当然也不会对。
调试CMakeLists.txt的方法:

message("hello")
message("value of VARNAME: ${VARNAME}")
message(FATAL_ERROR "Error" ) #显示Error并退出编译链接生成过程

symbol(s) not found for architechture x86_64
libabsl_failure_signal_handler.a不是arch x86_64

参考GPT和自己的思路,这个错误提示可能是由于链接器无法找到所需的库文件导致的。你可以尝试检查以下几个方面来解决这个问题:

1 确保库文件的路径是正确的。你可以检查链接器命令行中的 -L 参数是否指定了正确的库文件路径。如果路径不正确,链接器将无法找到库文件。

2 确保库文件名称是正确的。你可以检查链接器命令行中的 -l 参数是否指定了正确的库文件名称。如果名称不正确,链接器将无法找到库文件。

3 确保库文件已经被正确地安装了。你可以检查库文件是否已经被正确地安装在你的系统中。如果库文件没有被正确地安装,链接器将无法找到库文件。

4 确保库文件是可用的。你可以检查库文件是否被正确地编译和链接。如果库文件没有被正确地编译和链接,链接器将无法使用库文件。
5 缺少依赖库:如果你的项目依赖于其他库,但这些库没有正确地安装或链接,你的链接可能会失败。在这种情况下,你需要确保所有依赖库都已经正确地安装和链接。

6 平台不兼容:如果你的代码在一个平台上编译,但在另一个平台上链接,可能会导致链接失败。在这种情况下,你需要确保你的代码和库都是在同一个平台上编译和链接的。

7 编译器版本不兼容:如果你的代码使用了某些特定版本的编译器特性,但你的编译器版本太老或太新,可能会导致链接失败。在这种情况下,你需要升级或降级你的编译器版本,或者修改你的代码以使用更通用的特性。

8 编译选项不兼容:如果你的代码使用了某些编译选项,但库没有使用相同的编译选项,可能会导致链接失败。在这种情况下,你需要确保你的代码和库都使用相同的编译选项。

9 内存不足:如果你的系统内存不足,可能会导致链接失败。在这种情况下,你需要释放一些内存或者升级你的系统。

你可以尝试使用 -v 参数来查看链接器的详细输出信息,这可能有助于你找到问题所在。
假设你的链接失败是由于缺少某个依赖库导致的,那么你可以考虑修改你的代码来解决这个问题。下面是一个示例:

假设你的项目需要使用libcurl库来进行网络通信。你在链接时收到了类似于“undefined reference to `curl_easy_init'”这样的错误信息,表明链接器无法找到libcurl库中的某些函数。

在这种情况下,你需要确保你的代码正确地包含了libcurl库的头文件,并在链接时正确地指定了libcurl库。下面是一个示例:

#include <curl/curl.h>

int main()
{
    CURL *curl = curl_easy_init();
    // ...
    curl_easy_cleanup(curl);
    return 0;
}

在上面的代码中,我们包含了libcurl库的头文件,并在main函数中使用了curl_easy_init和curl_easy_cleanup函数。为了正确链接libcurl库,我们需要在链接器命令行中指定-lcurl参数。在使用conan构建项目时,你可以通过conanfile.txt文件的requires选项来添加libcurl库的依赖,例如:

[requires]
libcurl/7.77.0

[generators]
cmake

这将确保在构建项目时自动安装并链接libcurl库。在CMakeLists.txt文件中,你可以使用以下命令来添加libcurl库的链接:

find_package(CURL REQUIRED)
target_link_libraries(myapp CURL::libcurl)

这将告诉CMake在链接时使用libcurl库,并添加必要的编译和链接选项。

希望这个示例能够帮助你理解如何在代码中添加依赖库和正确地链接库。

这个问题可能与你的链接器设置有关。在链接时,链接器需要查找相关的库文件,以便将其与你的代码进行链接。如果链接器无法找到库文件,就会出现“连接不存在”的错误。
在CMake中使用Conan时,你可以通过以下方式来设置链接器搜索路径:


plaintext
Copy code
link_directories(${CONAN_LIB_DIRS})

这个命令将链接器搜索路径设置为Conan生成的库文件目录。如果你已经设置了库文件路径,可以检查一下路径是否正确,路径中是否包含了库文件的完整路径,以及库文件的名称是否正确。
另外,你也可以通过以下方式来指定特定的库文件:

plaintext
Copy code
target_link_libraries(your_target_name PUBLIC library_name)

这个命令将库文件名添加到链接器命令中。在这里,your_target_name是你的目标名称,library_name是你要链接的库文件名称。在这里,你可以尝试将库文件名和路径都指定为绝对路径,以便确保链接器可以正确找到库文件。
最后,你可以尝试清除构建目录并重新构建项目,以确保所有文件都已正确生成。如果上述方法都无法解决问题,你可以考虑联系Conan的技术支持人员,以获得更详细的建议。