g++ ld: symbool(en) niet gevonden voor architectuur x86_64

Ik probeer de Struck-codevan Sam Hare te compileren.

Ik gebruik mac OSX10.9, opencv 2.4.6 en Eigen 2.0.17.

Eigen en opencv headers worden opgeslagen in /opt/local/include terwijl opencv dylib in /opt/local/lib.

Ik heb de Hare’s Makefile aangepast om in deze map te werken. Als ik make typ op de terminal:

g++ -L/opt/local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc src/Config.o src/Features.o src/HaarFeature.o src/HaarFeatures.o src/HistogramFeatures.o src/ImageRep.o src/LaRank.o src/MultiFeatures.o src/RawFeatures.o src/Sampler.o src/Tracker.o src/main.o src/GraphUtils/GraphUtils.o -o struck

Ik krijg deze fouten:

Undefined symbols for architecture x86_64:  
"cv::namedWindow(std::__1::basic_string<char,
std::__1::char_traits<char>, std::__1::allocator<char> > const&,
int)", referenced from:
      _main in main.o   "cv::split(cv::Mat const&, std::__1::vector<cv::Mat, std::__1::allocator<cv::Mat> >&)",
referenced from:
      ImageRep::ImageRep(cv::Mat const&, bool, bool, bool) in ImageRep.o   "cv::imread(std::__1::basic_string<char,
std::__1::char_traits<char>, std::__1::allocator<char> > const&,
int)", referenced from:
      _main in main.o   "cv::imshow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&,
cv::_InputArray const&)", referenced from:
      LaRank::Debug() in LaRank.o
      Tracker::Debug() in Tracker.o
      _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see
invocation)

Enig idee? Bedankt!


Antwoord 1, autoriteit 100%

Ik had een soortgelijke waarschuwing/fout/mislukking toen ik gewoon een uitvoerbaar bestand probeerde te maken van twee verschillende objectbestanden (main.o en add.o). Ik gebruikte het commando:

gcc -o exec main.o add.o

Maar mijn programma is een C++-programma. Het gebruik van de g++-compiler loste mijn probleem op:

g++ -o exec main.o add.o

Ik had altijd de indruk dat gccdeze dingen zelf zou kunnen oplossen. Blijkbaar niet. Ik hoop dat dit iemand anders helpt bij het zoeken naar deze fout.


Antwoord 2, autoriteit 23%

eindelijk mijn probleem opgelost.

Ik heb een nieuw project in XCode gemaakt met de bronnen en de C++ Standard Library gewijzigd van de standaard libc++ in libstdc++ zoals in dezeen dit.


Antwoord 3

Ik heb mijn verklaring in het .h-bestand geschreven

class String
{
    String (const char * cstr = 0);
}; 

en ik gebruikte inline in een ander .cpp-bestand (implementatie)

inline String::String(const char * cstr)
{
//code ... 
}

dan gebruik ik g++ en krijg dit:
Ongedefinieerde symbolen voor architectuur x86_64:
“String::String(char const*)”, waarnaar wordt verwezen vanuit:
_main in test-d389f3.o
ld: symbool(en) niet gevonden voor architectuur x86_64

oplossing: schrijf niet inlinewanneer declaratie en implementatie onafhankelijk zijn.

Other episodes