生成文件:体系结构x86_64的未定义符号
Makefile: Undefined symbols for architecture x86_64
我正在使我的应用程序更具可移植性,可以在其他操作系统上运行。在XCode和Visual Studio中工作。但是,切换到Makefiles给我带来了一些问题。
错误:
Undefined symbols for architecture x86_64:
"AppObject::Instance()", referenced from:
_main in main-329f6c.o
ld: symbol(s) not found for architecture x86_64
主.cpp
#include <iostream>
#include "AppObject.hpp"
AppObject* _appObject;
int main()
{
_appObject = AppObject::Instance();
return 0;
}
AppObject.hpp
#ifndef _APPOBJECT_HPP_
#define _APPOBJECT_HPP_
#include <iostream>
class AppObject
{
public:
static AppObject* Instance();
virtual ~AppObject() {}
void initInstance();
private:
AppObject();
AppObject(const AppObject&);
AppObject& operator= (const AppObject&);
static AppObject* pinstance;
};
#endif // _APPOBJECT_HPP_
应用对象.cpp
#include "AppObject.hpp"
AppObject* AppObject::pinstance = 0;
AppObject::AppObject() {}
AppObject* AppObject::Instance()
{
if (pinstance == 0)
{
pinstance = new AppObject;
pinstance->initInstance();
}
return pinstance;
}
void AppObject::initInstance()
{
.....
}
这有点配对,但我也看到了其他一些警告:
warning: in-class initialization of non-static data member is a C++11 extension
谁能帮助我理解我的错误,我的这在 XCode 和 VS 中有效,但不使用 make?
生成文件
CXX=clang++
CXXFLAGS=-g -std=c++11 -Wall -pedantic -c
LDFLAGS=-L/usr/local/opt/sqlite/lib
CPPFLAGS=-I/usr/local/opt/sqlite/include
SOURCES=scraper/main.cpp scraper/AppObject.cpp scraper/SQLManager.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=scraper
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CXX) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CXX) $(CXXFLAGS) $< -o $@
全制作输出:
$ make
clang scraper/main.cpp -o scraper/main.o
In file included from scraper/main.cpp:3:
In file included from scraper/AppObject.hpp:6:
scraper/SQLManager.hpp:44:30: warning: in-class initialization of non- static data member is a C++11 extension
[-Wc++11-extensions]
bool _bDatabaseReady = false;
^
scraper/SQLManager.hpp:46:29: warning: in-class initialization of non- static data member is a C++11 extension
[-Wc++11-extensions]
std::string _dbFile = "popcorn.db3";
^
scraper/SQLManager.hpp:47:29: warning: in-class initialization of non- static data member is a C++11 extension
[-Wc++11-extensions]
std::string _dbName = "popcorn";
^
scraper/SQLManager.hpp:49:24: warning: in-class initialization of non- static data member is a C++11 extension
[-Wc++11-extensions]
int _dbVersion = 1; // increment this when database structure changes
^
scraper/SQLManager.hpp:51:28: warning: in-class initialization of non-static data member is a C++11 extension
[-Wc++11-extensions]
int _dbVersionType = 0; // 0 = normal, 1 = free, 2 = lite
^
5 warnings generated.
Undefined symbols for architecture x86_64:
"AppObject::Instance()", referenced from:
_main in main-4a5276.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [scraper/main.o] Error 1
从回复中获取建议后更新make
输出:
$ make
clang++ scraper/main.cpp -o scraper/main.o
In file included from scraper/main.cpp:3:
In file included from scraper/AppObject.hpp:6:
scraper/SQLManager.hpp:44:30: warning: in-class initialization of non- static data member is a C++11 extension [-Wc++11-extensions]
bool _bDatabaseReady = false;
^
scraper/SQLManager.hpp:46:29: warning: in-class initialization of non- static data member is a C++11 extension [-Wc++11-extensions]
std::string _dbFile = "popcorn.db3";
^
scraper/SQLManager.hpp:47:29: warning: in-class initialization of non- static data member is a C++11 extension [-Wc++11-extensions]
std::string _dbName = "popcorn";
^
scraper/SQLManager.hpp:49:24: warning: in-class initialization of non- static data member is a C++11 extension [-Wc++11-extensions]
int _dbVersion = 1; // increment this when database structure changes
^
scraper/SQLManager.hpp:51:28: warning: in-class initialization of non- static data member is a C++11 extension [-Wc++11-extensions]
int _dbVersionType = 0; // 0 = normal, 1 = free, 2 = lite
^
5 warnings generated.
Undefined symbols for architecture x86_64:
"AppObject::Instance()", referenced from:
_main in main-0e97bb.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [scraper/main.o] Error 1
首先,clang
是C前端。虽然它可用于编译C++代码,但它不会添加C++所需的所有标头路径或链接器库。使用clang++
。
其次,您显示的输出根本没有任何标志。
第三,链接器错误的原因是您不使用创建对象文件所需的-c
标志。如果没有-c
标志,则告诉clang
前端程序生成并链接名为scraper/main.o
的可执行文件。
相关文章:
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- C++ 中 dlsym 的未定义符号
- 仅在 MacOS 上析构函数的未定义符号
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 生成文件:体系结构x86_64的未定义符号
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- Xcode"体系结构x86_64的未定义符号"
- 体系结构x86_64的未定义符号:找不到原因
- SWIG链接器:未定义符号:_ZN2cv8fastFreeEPv(cv::fastFree(void*))
- 如何修复架构x86_64的未定义符号,Boost Asio 1.58
- 在Qt5上去静态库:架构的未定义符号x86_64:
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 监视 SDK 下的未定义符号"__Unwind_SjLj_Unregister"
- 使用 Boost/Python 的未定义符号 - 复杂
- 建筑x86_64的未定义符号:"vtkDebugLeaksManager::vtkDebugLeaksManager()",引用自: