【发布时间】:2020-10-07 09:51:36
【问题描述】:
我正在将一个 Windows C++ 项目移植到 linux。这个项目有许多静态库,这些库在一些共享库中使用过。其中一个静态库使用 SecureZeroMemory,这是一种特定于 Windows 的安全零数组的方法。为了在 linux 中使用这样的功能,我写了以下内容
#ifdef __linux__
#include <strings.h>
extern "C" void explicit_bzero(void *s, size_t n);
void SecureZeroMemory(void *s, size_t n) { explicit_bzero(s, n); }
#endif
使用它的静态库编译良好,没有错误。我的 CMakeLists.txt 文件非常标准,在添加源等之后我会这样做
add_library( myStaticLibrary STATIC ${source_files} )
它编译得很好。
然后,我尝试在另一个非常标准的 CMakeLists.txt 文件中编译一个使用刚才提到的共享库
add_library( mySharedLibrary SHARED ${source_files} )
target_link_libraries(mySharedLibrary c myStaticLibrary )
编译时出现错误:
myShareLibraryCode.cpp:XX undefined reference to `explicit_bzero'
ld returned 1 exit status
【问题讨论】:
-
为什么要单独声明?为什么不只是
#include <string.h>? (看起来它是手册页中 explicit_bzero 的字符串单数)。它是 2.25 中的新功能 - 您的 GLIBC 是否足够新?那是从 2017 年开始的,但如果你使用的是 LTS Linux,你可能会有更旧的东西。 -
是的,问题是版本。我以为我有一个带有 explicit_bzero 的版本,因为它在我的手册页中,但手册页说它出现在 2.25 中,而我有 2.24...