【问题标题】:Linking C++ code with 'gcc' (without g++)将 C++ 代码与“gcc”链接(没有 g++)
【发布时间】:2010-11-03 08:17:16
【问题描述】:

大家好:快速提问:我的情况是,只使用“gcc”(不使用 g++)生成我的 C++ 可执行文件会很有用。原因是我必须将代码提交到无法识别“g++”(或“c++”)命令的自动提交服务器。

在我的实验中,当我编译 gcc 运行良好。问题是,当我尝试链接生成的目标文件时,它会搞砸。现在,根据我从 gcc 手册页中的理解(我可能离题了,如果我是的话,请告诉我),g++ 基本上是 gcc,但它链接了 C++ 库。

如果这是真的,我如何(如果可能)使用 g++(或 c++)命令显式链接 C++ 库?

编辑:我正在添加生成文件以更好地说明问题:

COMPILER = gcc
CFLAGS = -Wall -g -x c++

# MODULE COMPILATION
model: modules/model.h modules/sources/model.cpp
    $(COMPILER) $(CFLAGS) -c modules/sources/model.cpp -o obj/model.o

algorithms: modules/algorithms.h modules/sources/algorithms.cpp
    $(COMPILER) $(CFLAGS) -c modules/sources/algorithms.cpp -o obj/algorithms.o

io: modules/io.h modules/sources/io.cpp
    $(COMPILER) $(CFLAGS) -c modules/sources/io.cpp -o obj/io.o

stopwatch: modules/stopwatch.h modules/sources/stopwatch.cpp
    $(COMPILER) $(CFLAGS) -c modules/sources/stopwatch.cpp -o obj/stopwatch.o

# EXECUTABLE GENERATION
exe: model algorithms io stopwatch
    $(COMPILER) $(CFLAGS) main.cpp obj/model.o obj/algorithms.o obj/io.o obj/stopwatch.o -o bin/process

# DEFAULT TEST CASE
run: exe
    ./bin/process -i data/nasa_small.log -a data/nasa_small.access -s data/nasa_small.stack

# CLEANING ROUTINE
clean:
    rm -f obj/*

【问题讨论】:

  • gcc 和 g++ 从字面上指向同一个可执行文件。唯一的区别是传递给后端的标志。
  • 修复自动提交服务器!

标签: c++ gcc linker


【解决方案1】:

您可以将带有-l 标志的标准c++ 库链接到gcc:

gcc cplusplus.o -lstdc++ -o myexe

【讨论】:

  • 这很好用,我不知道要链接它的库的名称。
  • 多年来我一直在成功使用这种技术。但我刚刚升级到 Ubuntu 11.10 (gcc 4.6.1) 并且它停止工作了。我现在在几台机器上收到“对‘operator new(unsigned long)’的未定义引用”错误。其他人有这个问题吗?
  • 哦,没关系。这是因为我一直将 -lstdc++ 放在 o 文件之前。较新版本的 GCC 似乎要求您将库放在 o 文件之后。
  • 这个链接是动态库还是静态库?我注意到我的系统上有用于 stdc++ 的 .so 和 .a 文件。
【解决方案2】:

如果您使用“-v”选项运行 g++,它将显示它使用的命令和选项。您应该能够从那里推断出正确的 gcc 命令行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多