链接错误 - C++ Clang MacOs
Linking Error - C++ Clang MacOs
我有两个项目,都是用 clang++ 和 Xcode 在 MacOS 上构建的。
我有一个 header 定义如下的库.... (serialization.h)
#pragma once
#include <visionApp/cv/matchers/visual_database.h>
namespace visionApp {
void serializeDB(visionApp::VisualDb visualDB, std::string fileName);
visionApp::VisualDb* deserializeDB(std::string fileName);
}
cpp文件如下.... (serialization.cpp)
#include "serialization.h"
namespace visionApp {
void serializeDB(visionApp::VisualDb visualDB, std::string fileName)
{
}
visionApp::VisualDb* deserializeDB(std::string fileName)
{
return new visualDB();
}
}
然后在另一个class中调用该方法.....
void saveRecogniser(std::string fileName)
{
serializeDB(currentVisualDB.get(), fileName);
}
void loadRecogniser(std::string fileName)
{
mVisualDatabase.reset(deserializeDB(fileName));
}
注意:currentVisualDB 是指向 .get() 的共享指针 returns 指针。
这一切都很好。太棒了……然后 libvisionApp.a
但是当我构建一个只能看到 headers 的依赖应用程序时,我收到以下错误....
Undefined symbols for architecture x86_64:
"visionApp::serializeRecognizer(visionApp::VisualDb*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from:
visionApp::Recogniser::saveRecogniser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in libvisionApp.a(planar_recogniser.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
现在,这个 linking 错误表明 clang 无法 link 序列化方法,但反序列化方法没有问题。删除序列化方法,只保留反序列化正确构建。
我不明白这个问题,不确定如何进行。有人可以教我在这种情况下该怎么做吗?
关于如何解决这个问题有什么建议吗?
注意:相关库的 Lipo 输出。
Hal:Release daniel$ lipo -info libvisionDB.a
input file libvisionDB.a is not a fat file
Non-fat file: libvisionDB.a is architecture: x86_64
您已声明 serializeDB
以按值获取第一个参数。
void serializeDB(visionApp::VisualDb visualDB, std::string fileName);
调用函数时,使用指针作为第一个参数:
void saveRecogniser(std::string fileName)
{
serializeDB(currentVisualDB.get(), fileName); // You said that currentVisualDB is a std::shared_ptr
}
我不知道为什么您的构建会进入链接阶段,它不应该。也许你有不止一处声明 serializeDB
?
我有两个项目,都是用 clang++ 和 Xcode 在 MacOS 上构建的。
我有一个 header 定义如下的库.... (serialization.h)
#pragma once
#include <visionApp/cv/matchers/visual_database.h>
namespace visionApp {
void serializeDB(visionApp::VisualDb visualDB, std::string fileName);
visionApp::VisualDb* deserializeDB(std::string fileName);
}
cpp文件如下.... (serialization.cpp)
#include "serialization.h"
namespace visionApp {
void serializeDB(visionApp::VisualDb visualDB, std::string fileName)
{
}
visionApp::VisualDb* deserializeDB(std::string fileName)
{
return new visualDB();
}
}
然后在另一个class中调用该方法.....
void saveRecogniser(std::string fileName)
{
serializeDB(currentVisualDB.get(), fileName);
}
void loadRecogniser(std::string fileName)
{
mVisualDatabase.reset(deserializeDB(fileName));
}
注意:currentVisualDB 是指向 .get() 的共享指针 returns 指针。
这一切都很好。太棒了……然后 libvisionApp.a
但是当我构建一个只能看到 headers 的依赖应用程序时,我收到以下错误....
Undefined symbols for architecture x86_64:
"visionApp::serializeRecognizer(visionApp::VisualDb*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)", referenced from:
visionApp::Recogniser::saveRecogniser(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in libvisionApp.a(planar_recogniser.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
现在,这个 linking 错误表明 clang 无法 link 序列化方法,但反序列化方法没有问题。删除序列化方法,只保留反序列化正确构建。
我不明白这个问题,不确定如何进行。有人可以教我在这种情况下该怎么做吗?
关于如何解决这个问题有什么建议吗?
注意:相关库的 Lipo 输出。
Hal:Release daniel$ lipo -info libvisionDB.a
input file libvisionDB.a is not a fat file
Non-fat file: libvisionDB.a is architecture: x86_64
您已声明 serializeDB
以按值获取第一个参数。
void serializeDB(visionApp::VisualDb visualDB, std::string fileName);
调用函数时,使用指针作为第一个参数:
void saveRecogniser(std::string fileName)
{
serializeDB(currentVisualDB.get(), fileName); // You said that currentVisualDB is a std::shared_ptr
}
我不知道为什么您的构建会进入链接阶段,它不应该。也许你有不止一处声明 serializeDB
?