我在main.cpp中有以下源代码:
#include <iostream>
#include <iomanip>
int main() {
std::cout << "Hi" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用此命令可以工作,并创建可执行文件:
g++ -o main main.cpp
Run Code Online (Sandbox Code Playgroud)
但是这个命令不起作用:
g++ -c main.cpp
ld -o main main.o
Run Code Online (Sandbox Code Playgroud)
第二个错误:
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8
main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
main.cpp:(.text+0x14): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
main.cpp:(.text+0x1c): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
main.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4f): undefined reference to `std::ios_base::Init::~Init()'
main.cpp:(.text+0x54): undefined reference to `__dso_handle'
main.cpp:(.text+0x61): undefined reference to `__cxa_atexit'
Run Code Online (Sandbox Code Playgroud)
Sod*_*ved 14
我想如果你ld直接使用它默认不包括C++库.您也可以使用g++它进行链接,它将ld使用正确的设置进行调用.
g++ -c main.cpp
g++ -o main main.o
Run Code Online (Sandbox Code Playgroud)
Joh*_*itb 13
GCC内部链接了一些额外的库和目标文件.要查看它们是什么,执行-###,它将打印它将执行的工具命令,包括链接器.我的GCC所使用的连接器的命令是(我做了实际的.o文件I调用g++上大胆的,所以你可以很容易地发现它).
/usr/lib/gcc/i686-pc-linux-gnu/4.6.0/collect2 --build-id --eh-frame-hdr -m elf_i386"--hash-style = both"-dynamic-linker/lib /ld-linux.so.2 /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../crt1.o/usr/lib/gcc/i686-pc- linux-gnu/4.6.0 /../../../ crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/crtbegin.o -L/usr/lib/gcc /i686-pc-linux-gnu/4.6.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.6.0 /../../ .. main1.o "-lstdc ++" - lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/crtend.o /usr/lib/gcc/i686-pc-linux-gnu/4.6.0 /../../../crtn.o
您可以替换collect2路径ld(如果我没记错的话,collect2只需要作为ld不支持现代二进制格式的GCC后端的真实代理,根据其错位名称收集构造函数和析构函数.ELF格式具有原生性部分支持该).
执行该命令,用ld字面替换,成功链接可执行文件.
使用时g++,它还链接链接libstd++器用于解析名称的库.但是使用g++ -c然后ld不要自动链接库.您现在要手动链接库.
尝试(未经测试):
ld -o main main.o -llibstd++
Run Code Online (Sandbox Code Playgroud)
或者您可以通过阅读本手册来查看正确的语法:
| 归档时间: |
|
| 查看次数: |
20184 次 |
| 最近记录: |