最近遇到这么一个问题,想了很久没有解决办法,请各位帮忙看看应该怎么办。
具体需求是这样,我们公司需要使用 GNU 编译器+LLVM LibC++来编译产品。在 LLVM 官网上可以看到,用以下命令可以用 GCC+LLVM LibC++编译:LLVM Link
$ g++ -nostdinc++ -I<libcxx-install-prefix>/include/c++/v1 \
test.cpp -nodefaultlibs -lc++ -lc++abi -lm -lc -lgcc_s -lgcc
这里由于没有使用 GNU LibstdC++,因此需要手动链接 libc++
。另外注意test.cpp
的顺序是在-lc++
和-lc++abi
之前的,这样 linker 由左至右(存疑)扫文件的时候才可以正确链接。Stackoverflow 解释
如果将test.cpp
挪到-lc++abi
之后,编译器会报找不到operator new(unsigned long)
,原因看上述链接。这里的结论就是源代码必须出现在 libc++之前。
问题就在于,我们用 CMake 来编译,生成的最终编译命令类似:
/usr/bin/c++ \
-nostdinc++ \
-nodefaultlibs \
-I/usr/include/c++/v1 \
-lc++ \
-lc++abi \
-lc \
-lgcc_s \
-lgcc \
-lm \
-frecord-gcc-switches \
-Wall \
-Werror=format-security \
-Werror=implicit-function-declaration \
-Wextra \
-Wno-unused \
-Wcast-align \
-Wunused-result \
-Wno-error=deprecated-declarations \
-Woverloaded-virtual \
-Wlogical-op \
-Wno-noexcept-type \
-Wno-duplicated-branches \
-O2 \
-g \
-DNDEBUG \
-ftree-vectorize \
-Wpedantic \
-Werror \
-std=gnu++14 \
-o \
test_runner \
/home/xx.xxxx/gc/xxx_ws/main.cpp
CMake 生成的命令中源代码在最后,因此链接器在扫过libc++.so
之后就扔掉了里面所有的内容(因为 unresolved symbol table 这时候还是空),然后在遇到main.cpp.o
的时候就找不到operator new
了。
有什么办法能改变 CMake 生成的最终编译命令中源代码所在的位置呢?谢谢。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.