我有一个C++项目,需要使用abseil字符串库和abseil状态库。然而我的项目很大,目前没有使用 cmake,而只是使用 Makefile。
我已尝试以下步骤:
make install DESTDIR=<some local dir>
但是,我在链接阶段仍然收到未定义的参考错误。例如,下面附有一个片段:
scratch/abseil-cpp/build/out/usr/local/lib64/libabsl_cordz_info.a(cordz_info.cc.o): In function `absl::cord_internal::CordzInfo::Head(absl::cord_internal::CordzSnapshot const&)':
cordz_info.cc:(.text+0x8a4): undefined reference to `absl::cord_internal::CordzHandle::DiagnosticsHandleIsSafeToInspect(absl::cord_internal::CordzHandle const*) const'
scratch/abseil-cpp/build/out/usr/local/lib64/libabsl_cordz_info.a(cordz_info.cc.o): In function `absl::cord_internal::CordzInfo::Next(absl::cord_internal::CordzSnapshot const&) const':
cordz_info.cc:(.text+0x98c): undefined reference to `absl::cord_internal::CordzHandle::DiagnosticsHandleIsSafeToInspect(absl::cord_internal::CordzHandle const*) const'
cordz_info.cc:(.text+0x9b3): undefined reference to `absl::cord_internal::CordzHandle::DiagnosticsHandleIsSafeToInspect(absl::cord_internal::CordzHandle const*) const'
scratch/abseil-cpp/build/out/usr/local/lib64/libabsl_cordz_info.a(cordz_info.cc.o): In function `absl::cord_internal::CordzInfo::CordzInfo(absl::cord_internal::CordRep*, absl::cord_internal::CordzInfo const*, absl::cord_internal::CordzUpdateTracker::MethodIdentifier, long)':
cordz_info.cc:(.text+0xf01): undefined reference to `absl::cord_internal::CordzHandle::~CordzHandle()'
scratch/abseil-cpp/build/out/usr/local/lib64/libabsl_cordz_info.a(cordz_info.cc.o): In function `absl::cord_internal::CordzInfo::~CordzInfo()':
cordz_info.cc:(.text+0xf76): undefined reference to `absl::cord_internal::CordzHandle::~CordzHandle()'
scratch/abseil-cpp/build/out/usr/local/lib64/libabsl_cordz_info.a(cordz_info.cc.o): In function `absl::cord_internal::CordzInfo::Untrack()':
由于我在这里包含了与absl对应的所有库文件,我认为错误是由于库的排序不正确而发生的?
有人在没有cmake的情况下使用absl吗?任何帮助将不胜感激。
您未定义的参考错误(您仅向我们展示了其中的错误) 示例)意味着您的库出现故障 (库必须在其依赖的库之前显示链接) 或者您没有链接您需要的所有内容。
由于您正在使用abseil strings库和abseil status库进行构建,因此您必须安装 绳索开发包。 (你没有说你的发行版是什么,但是例如 对于 Ubuntu 来说是
libabsl-dev
。)因此你已经安装了
图书馆的 .pc
文件,您可以询问 pkg-config
告诉您链接absl_strings
和absl_status
的链接要求,包括
它们依赖的库以及链接它们的顺序。
~$ pkg-config absl_strings --libs
-labsl_strings -labsl_strings_internal -Wl,--push-state,--as-needed \
-latomic -Wl,--pop-state -lrt -labsl_base -labsl_spinlock_wait \
-labsl_int128 -labsl_throw_delegate -labsl_raw_logging_internal \
-labsl_log_severity
$ pkg-config absl_status --libs
-labsl_status -labsl_cord -labsl_cordz_info -labsl_cord_internal \
-labsl_cordz_functions -labsl_exponential_biased -labsl_cordz_handle \
-labsl_synchronization -labsl_graphcycles_internal -labsl_time \
-labsl_civil_time -labsl_time_zone -labsl_bad_optional_access \
-labsl_stacktrace -labsl_str_format_internal -labsl_strerror \
-labsl_symbolize -labsl_debugging_internal -labsl_demangle_internal \
-labsl_malloc_internal -labsl_strings -labsl_strings_internal \
-Wl,--push-state,--as-needed -latomic -Wl,--pop-state -lrt \
-labsl_base -labsl_spinlock_wait -labsl_int128 \
-labsl_throw_delegate -labsl_raw_logging_internal \
-labsl_log_severity
在这里你可以看到,例如,
libabsl_status
取决于labsl_strings
,所以至少你会
需要按顺序将它们输入到链接器。
无需将所有内容逐字输入到链接选项中,只需替换
-labsl_strings
随着外壳扩展:
$(pkg-config absl_strings --libs)
同样将
-labsl_status
替换为:
$(pkg-config absl_status --libs)
在Makefile中的联动命令中。这样您就有更好的机会成功连接, 尽管您没有向我们展示您当前失败的链接是什么,或其所有错误, 它可能仍然会失败。
您还可以顺便要求
pkg-config
告诉您这些所需的编译器选项
图书馆:
$ pkg-config absl_status --cflags
-DNOMINMAX
$ pkg-config absl_strings --cflags
-DNOMINMAX