【发布时间】:2013-04-29 17:41:50
【问题描述】:
我的 MacBook 上默认使用 GNU 4.7.1。当我在学校的服务器上运行我的程序时,我不断收到大量的段错误。我从学校服务器下载了程序的当前状态,以便可以使用 NetBeans 帮助进行调试。在让更新的 GNU 替换我的 MacBook 继续设置为默认值的古老 4.2 版本时,我遇到了很多问题。
OSX 编译器对我来说是全新的,我无法调整我的 makefile 来编译所有东西,就像它在我学校的服务器上一样。
人们告诉我使用 gcc 或 g++ 而不是其他,但其他人告诉我这不重要。据我了解,OSX 为 c/c++ 的较新版本的 GNU 使用不同的库,现在 Clang 是标准?我想坚持使用 GNU/GCC,因为那是我在我的 CS 课程中使用的。
目前看来,当我的 makefile 尝试链接“std::mt19937”时,它找不到链接它的标头。
我的问题是:我怎样才能让我的 makefile 编译以便使用 std::mt19937 和 c++11 库?
制作文件
OBJECTS = Ammunition.o Armor.o Consumable.o Creature.o Entity.o Gold.o Item.o parser.o Potion.o Scroll.o Weapon.o XMLSerializable.o CreatureFactory.o DungeonLevel.o Player.o Tile.o ItemFactory.o
HEADERS = Ammunition.h Armor.h Consumable.h Creature.h Entity.h Gold.h Item.h parser.h Potion.h Scroll.h Weapon.h XMLSerializable.h CreatureFactory.h DungeonLevel.h Player.h Tile.h ItemFactory.h
all: Jhack
# I tried this and adding $(LIBS) where "-std=c++0x" is below..
# LIBS = -std=c++0x -std=c++11 -std=gnu++11
%.o: %.cpp $(HEADERS)
gcc -c $< -o $@ -std=c++0x
Jhack: $(OBJECTS) main.o
gcc -o Jhack $^
clean:
rm -f *.o Jhack
run: Jhack
./Jhack
我尝试将“-std=c++0x”替换为 -std=c++11 和 -std=gnu++11。我也尝试将它们都添加。我也尝试将 gcc 换成 g++,但我似乎尝试或更改的所有内容都会导致更多错误和警告。
这是当前错误消息的第一部分(它会一直持续下去):
gcc -c Ammunition.cpp -o Ammunition.o -std=c++0x
gcc -c Armor.cpp -o Armor.o -std=c++0x
gcc -c Consumable.cpp -o Consumable.o -std=c++0x
gcc -c Creature.cpp -o Creature.o -std=c++0x
gcc -c Entity.cpp -o Entity.o -std=c++0x
gcc -c Gold.cpp -o Gold.o -std=c++0x
gcc -c Item.cpp -o Item.o -std=c++0x
gcc -c parser.cpp -o parser.o -std=c++0x
gcc -c Potion.cpp -o Potion.o -std=c++0x
gcc -c Scroll.cpp -o Scroll.o -std=c++0x
gcc -c Weapon.cpp -o Weapon.o -std=c++0x
gcc -c XMLSerializable.cpp -o XMLSerializable.o -std=c++0x
gcc -c CreatureFactory.cpp -o CreatureFactory.o -std=c++0x
gcc -c DungeonLevel.cpp -o DungeonLevel.o -std=c++0x
gcc -c Player.cpp -o Player.o -std=c++0x
gcc -c Tile.cpp -o Tile.o -std=c++0x
gcc -c ItemFactory.cpp -o ItemFactory.o -std=c++0x
gcc -c main.cpp -o main.o -std=c++0x
gcc -o Jhack Ammunition.o Armor.o Consumable.o Creature.o Entity.o Gold.o Item.o parser.o Potion.o Scroll.o Weapon.o XMLSerializable.o CreatureFactory.o DungeonLevel.o Player.o Tile.o ItemFactory.o main.o
ld: warning: ignoring file Creature.o, file was built for unsupported file format ( 0x7f 0x45 0x4c 0x46 0x 2 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 ) which is not the architecture being linked (x86_64): Creature.o
Undefined symbols for architecture x86_64:
"Creature::removeMonster(DungeonLevel&)", referenced from:
vtable for Player in Player.o
"Creature::dumpObjectData()", referenced from:
Player::dumpObjectData() in Player.o
"Creature::setElementData(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
Player::setElementData(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >) in Player.o
"Creature::writeDataAsFragment(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
Player::writeDataAsFragment(std::basic_ostream<char, std::char_traits<char> >&) in Player.o
"Creature::move(DungeonLevel&, Creature&, std::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>&)", referenced from:
vtable for Player in Player.o
"Creature::getHP()", referenced from:
vtable for Player in Player.o
_main in main.o
"Creature::setHP(int)", referenced from:
Player::Player() in Player.o
Player::Player() in Player.o
vtable for Player in Player.o
"Creature::attack(Creature*, Creature&, std::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>&, DungeonLevel&)", referenced from:
vtable for Player in Player.o
"Creature::getXLoc()", referenced from:
vtable for Player in Player.o
【问题讨论】:
-
对于 gcc 4.7 系列,它的 -std=c++11,而不是 -std=c++0x。更重要的是,您应该使用 g++,而不是 gcc。您正在编译 c++ 代码,而不是 c 代码。您可以使用 gcc 编译 c++ 代码,但现在您需要通过 --option 标志之一告诉 gcc 要编译哪种语言。只需使用 g++。关于“文件是为不支持的文件格式构建的”问题——你是如何构建 gcc 的?在我看来,您将其构建为 x86_64 以外的某个目标的交叉编译器。
-
建议你使用 fink (finkproject.org) 或 macports (macports.org),而不是自己下载 gcc。让其中一个工具为您完成所有工作。
-
@DavidHammen 我使用 macports 安装它。出于某种原因,开发人员文件的所有路径在我的 MacBook 上都很奇怪。我花了很长时间试图让 macports 甚至工作。我将 c++0x 更改为 c++11,并将 gcc 更改为 g++,但仍然出现错误。
-
您使用的是 gcc(或 g++),而不是某些特定于路径的名称。
which gcc的评估结果是什么?换句话说,您使用的是正确的 gcc / g++ 吗?你的PATH是什么? -
Homebrew FTW.
标签: c++ netbeans linker makefile gnu