【发布时间】:2019-01-09 07:13:49
【问题描述】:
我试图编译以下代码两次,一次使用-m32,一次没有:
// File mylib.cc
#include <iostream>
void print_int_size() {
std::cout << sizeof(int*) << std::endl;
}
// File main.cc
void print_int_size();
int main() {
print_int_size();
return 0;
}
我的 CMakeLists.txt 中有以下内容:
project (Link32b VERSION 0.91 LANGUAGES CXX)
add_library ( mylib STATIC mylib.cc )
add_library ( mylib_32b STATIC mylib.cc )
target_compile_options ( mylib_32b PUBLIC -m32 )
add_executable ( main main.cc )
add_executable ( main_32b main.cc )
target_compile_options ( main_32b PRIVATE -m32 )
target_link_libraries ( main PRIVATE mylib )
target_link_libraries ( main_32b PRIVATE mylib_32b )
编译时得到如下输出(与gcc类似):
Scanning dependencies of target mylib
[ 12%] Building CXX object CMakeFiles/mylib.dir/mylib.cc.o
[ 25%] Linking CXX static library libmylib.a
[ 25%] Built target mylib
Scanning dependencies of target main
[ 37%] Building CXX object CMakeFiles/main.dir/main.cc.o
[ 50%] Linking CXX executable main
[ 50%] Built target main
Scanning dependencies of target mylib_32b
[ 62%] Building CXX object CMakeFiles/mylib_32b.dir/mylib.cc.o
[ 75%] Linking CXX static library libmylib_32b.a
[ 75%] Built target mylib_32b
Scanning dependencies of target main_32b
[ 87%] Building CXX object CMakeFiles/main_32b.dir/main.cc.o
[100%] Linking CXX executable main_32b
ld: warning: ignoring file CMakeFiles/main_32b.dir/main.cc.o, file was built for i386 which is not the architecture being linked (x86_64): CMakeFiles/main_32b.dir/main.cc.o
ld: warning: ignoring file libmylib_32b.a, file was built for archive which is not the architecture being linked (x86_64): libmylib_32b.a
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [main_32b] Error 1
make[1]: *** [CMakeFiles/main_32b.dir/all] Error 2
make: *** [all] Error 2
我在这里错过了什么?
===
更新:奇怪的是,将CMAKE_CXX_FLAGS 设置为包含-m32 会使示例工作。但是,我想在不设置变量的情况下完成它,即遵循现代基于目标的方法。
【问题讨论】:
-
看起来您还需要为 链接器 指定标志
-m32,例如在 that answer 中。请注意,STATIC 库不需要链接器标志,因为它实际上没有链接。 -
似乎答案是
-m32选项不是INTERFACEd 输出到链接器。这解决了我的问题;如果您添加回复,我很乐意接受。 -
确实可以从this reply 推断出我的问题的答案,但是(a)该线程上的前几个答案根本不是我想要的,并且(b)问题本身是不同的.该用户询问如何使用
-m32编译他们自己的代码,而我询问如何将-m32标志传递给链接器。我的问题的另一个组成部分是,假设-m32选项将可供链接器使用似乎是合理的,因为它是链接库的PUBLIC属性,但显然情况并非如此。跨度> -
“该线程上的前几个答案根本不是我想要的” - 呃?第一个答案告诉使用 LINK_FLAGS。至于设置 COMPILE_FLAGS 属性 - 它与
target_compile_options相同。 “该用户询问如何使用-m32编译他们自己的代码,而我询问如何将-m32标志传递给链接器。” - 你的整个问题是用-m32编译,而引用的问题正是关于这个问题的。当然,并非所有答案都适合您,但您想要的答案都包含在所引用的问题中。
标签: cmake 32bit-64bit