最近遇到这么一个问题,想了很久没有解决办法,请各位帮忙看看应该怎么办。
具体需求是这样,我们公司需要使用 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 生成的最终编译命令中源代码所在的位置呢?谢谢。
1
ppzbreeze 2019-09-20 09:42:06 +08:00
看来精通这方面的老哥不多啊,都不见回答
|
2
xylophone21 2019-09-20 09:53:20 +08:00
target_link_libraries(main
-Wl,--start-group c++ c++abi m c gcc_s -Wl,--end-group ) |
3
AaronLiang 2019-09-20 09:57:26 +08:00
|
4
qza1212 2019-09-20 10:14:00 +08:00
1. 使用 Xlinker "-("-lz -lxxx"-)" 通过-( )- 强制 repeat
2. 添加"-Wl,--no-as-needed"到 LDFLAGS 3. 使用 libc++.a (我不确定有没有静态库) |
5
waruqi 2019-09-20 10:19:00 +08:00
改用 xmake 吧,顺序添加就行了,add_syslinks("c++", "c++abi", "m", "c", "gcc_s", "gcc")
|
6
dangyuluo OP @ppzbreeze CMAKE 确实挺难的。。
@AaronLiang @xylophone21 几百个包,还有第三方的代码,没办法一个个修改,只能用 toolchain 来全剧定义 @waruqi 公司决策不是我能决定的。 @qza1212 我研究一下 |
7
xylophone21 2019-09-20 20:46:45 +08:00
@dangyuluo 其实不要以为这里把顺序调整对了就好了,你会发现后面还有别的顺序问题。只有 group 最可靠
|
8
dangyuluo OP @xylophone21 可以详细说明一下么?谢谢
|
9
wutiantong 2019-10-06 05:06:01 +08:00 via iPhone
你这 CMakeLists 写成啥样了?
|
10
dangyuluo OP @wutiantong 你是问我怎么解决的么?
|
11
wutiantong 2019-10-06 05:20:14 +08:00 via iPhone
@dangyuluo 不是的,解决了就好
|