我们如何在没有CMake的情况下使用abseil?

问题描述 投票:0回答:1

我有一个C++项目,需要使用abseil字符串库和abseil状态库。然而我的项目很大,目前没有使用 cmake,而只是使用 Makefile。

我已尝试以下步骤:

  • 从源头克隆绳索
  • 进行 cmake 和构建
  • 跑步
    make install DESTDIR=<some local dir>
  • 在编译命令中使用上面创建的所有库文件。即我正在链接所有文件,例如 /local/lib64/libatlas_strings.a 等。

但是,我在链接阶段仍然收到未定义的参考错误。例如,下面附有一个片段:

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吗?任何帮助将不胜感激。

cmake makefile abseil
1个回答
0
投票

您未定义的参考错误(您仅向我们展示了其中的错误) 示例)意味着您的库出现故障 (库必须在其依赖的库之前显示链接) 或者您没有链接您需要的所有内容。

由于您正在使用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
© www.soinside.com 2019 - 2024. All rights reserved.