文件是为不是正在链接的体系结构的存档构建的 (x86_64)

file was built for archive which is not the architecture being linked (x86_64)

我使用 makefile 编译我的 C++ 程序,但它显示警告:

make
g++ -g -std=c++0x -o ns-client main.cpp Client.cpp TCPConnect.cpp RSAsample.cpp libStatic/libchilkat_i386.a libStatic/libchilkat_x86_64.a -lpthread
ld: warning: ignoring file libStatic/libchilkat_i386.a, file was built for archive which is not the architecture being linked (x86_64): libStatic/libchilkat_i386.a

我的makefile如下:

cat Makefile 
LIBS = libStatic/libchilkat_i386.a libStatic/libchilkat_x86_64.a -lpthread
GPP = g++ -g -std=c++0x
TARGET = -o ns-client
CPP = main.cpp Client.cpp TCPConnect.cpp RSAsample.cpp

all:
$(GPP) $(TARGET) $(CPP) $(LIBS)
clean:
rm ns-client

libchilkat_i386.alibchilkat_x86_64.a是我下载的,不是我实现的。我把它们放在一个名为 "libStatic" 的目录下。 这些都是我的 C++ 文件和库:

ls
Client.cpp      RSAsample.cpp       libStatic
Client.h        RSAsample.h     main.cpp
Client_Common.h     TCPConnect.cpp      ns-client
Common_Num_Define.h TCPConnect.h        ns-client.dSYM
Common_Protocol.h   include         ns-server
Makefile        libDyn

在 libStatic 目录中,它有:

ls
libchilkat_i386.a   libchilkat_x86_64.a

我不知道为什么会出现这个警告。即使它有这个警告,它仍然编译成功。但是当我把它们上传到我们学校的服务器并编译它们时(我肯定上传这些静态库),它显示:

 undefined reference to   

很多这样的错误。例如:

/home/users/liuly/liuly/networksecurity/project/cplus/client/Client.cpp:17: undefined reference to `CkRsa::exportPublicKey()'

此类错误中提到的所有这些函数和变量都应包含在 libchilkat_i386.a libchilkat_x86_64.a 中 所以我怀疑是不是因为我的 Makefile.But 我不确定。我也怀疑这可能与第一个警告有关。有人能告诉我如何解决第一个警告或者为什么它不能在另一台机器上编译但可以在我自己的机器上编译吗?感谢大家的帮助!

这是它在我们学校的服务器上显示的所有错误:

/tmp/ccA32Kao.o: In function `My_RSA::My_RSA()':
main.cpp:(.text._ZN6My_RSAC2Ev[_ZN6My_RSAC5Ev]+0x19): undefined reference to `CkRsa::CkRsa()'
main.cpp:(.text._ZN6My_RSAC2Ev[_ZN6My_RSAC5Ev]+0x2b): undefined reference to `CkRsa::CkRsa()'
main.cpp:(.text._ZN6My_RSAC2Ev[_ZN6My_RSAC5Ev]+0x3d): undefined reference to `CkRsa::CkRsa()'
main.cpp:(.text._ZN6My_RSAC2Ev[_ZN6My_RSAC5Ev]+0x54): undefined reference to `CkRsa::~CkRsa()'
main.cpp:(.text._ZN6My_RSAC2Ev[_ZN6My_RSAC5Ev]+0x69): undefined reference to `CkRsa::~CkRsa()'
/tmp/ccA32Kao.o: In function `My_RSA::~My_RSA()':
main.cpp:(.text._ZN6My_RSAD2Ev[_ZN6My_RSAD5Ev]+0x1a): undefined reference to `CkRsa::~CkRsa()'
main.cpp:(.text._ZN6My_RSAD2Ev[_ZN6My_RSAD5Ev]+0x2c): undefined reference to `CkRsa::~CkRsa()'
main.cpp:(.text._ZN6My_RSAD2Ev[_ZN6My_RSAD5Ev]+0x3c): undefined reference to `CkRsa::~CkRsa()'
/tmp/cciEnFVR.o: In function `Client::Register()':
                /home/users/liuly/liuly/networksecurity/project/cplus/client/Client.cpp:17: undefined reference to `CkRsa::exportPublicKey()'
    /home/users/liuly/liuly/networksecurity/project/cplus/client/Client.cpp:18: undefined reference to `CkRsa::exportPrivateKey()'

/tmp/cciEnFVR.o: 在函数中 Client::Login()': /home/users/liuly/liuly/networksecurity/project/cplus/client/Client.cpp:128: undefined reference toCkRsa::exportPublicKey()' /home/users/liuly/liuly/networksecurity/project/cplus/client/Client.cpp:129: 未定义对 CkRsa::exportPrivateKey()' /tmp/cciEnFVR.o: In functionClient::Judge_Command(char*)' 的引用: /home/users/liuly/liuly/networksecurity/project/cplus/client/Client.cpp:930 : 对 CkRsa::exportPrivateKey()' /home/users/liuly/liuly/networksecurity/project/cplus/client/Client.cpp:931: undefined reference toCkRsa::exportPublicKey()' 的未定义引用 /tmp/ccRMXreb.o: 在函数 My_RSA::MyEncryption(char const*, char const*)': /home/users/liuly/liuly/networksecurity/project/cplus/client/RSAsample.cpp: 16: undefined reference toCkRsa::put_EncodingMode(char const*)' /home/users/liuly/liuly/networksecurity/project/cplus/client/RSAsample.cpp: 17: 未定义引用 CkRsa::ImportPublicKey(char const*)' /home/users/liuly/liuly/networksecurity/project/cplus/client/RSAsample.cpp: 25: undefined reference toCkRsa::encryptStringENC(char const*, bool)' /tmp/ccRMXreb.o: 在函数 My_RSA::MyDecryption(char*)': /home/users/liuly/liuly/networksecurity/project/cplus/client/RSAsample.cpp: 33: undefined reference toCkRsa::put_EncodingMode(char const*)' /home/users/liuly/liuly/networksecurity/project/cplus/client/RSAsample.cpp: 34: 未定义引用 CkRsa::ImportPrivateKey(char const*)' /home/users/liuly/liuly/networksecurity/project/cplus/client/RSAsample.cpp: 42: undefined reference toCkRsa::decryptStringENC(char const*, bool)' /tmp/ccRMXreb.o: 在函数 My_RSA::My_Initial_Key()': /home/users/liuly/liuly/networksecurity/project/cplus/client/RSAsample.cpp: 52: undefined reference toCkRsa::UnlockComponent(char const*)' /home/users/liuly/liuly/networksecurity/project/cplus/client/RSAsample.cpp: 58: 对 CkRsa::GenerateKey(int)' /home/users/liuly/liuly/networksecurity/project/cplus/client/RSAsample.cpp: 61: undefined reference toCkMultiByteBase::lastErrorText() 的未定义引用 collect2:错误:ld 返回 1 退出状态 make: *** [all] 错误 1

所有这些应该属于CKRsa的功能都在#include "include/CkRsa.h"里,但我肯定在我们学校的服务器上创建了"include"目录,并在该目录下上传了这些CKRsa.h文件。

我修改了我的makefile,但还是不行:

cat Makefile 
LFLAGS += -L     /home/users/liuly/liuly/networksecurity/project/cplus/client/libStatic 
LIBS = libStatic/libchilkat_x86_64.a  -lpthread
GPP = g++ -g -std=c++0x
TARGET = -o ns-client
CPP = main.cpp Client.cpp TCPConnect.cpp Common_Protocol.h RSAsample.cpp TCPConnect.h Client.h RSAsample.h include/CkRsa.h

all:
    $(GPP) $(LFLAGS)  $(TARGET) $(CPP) $(LIBS)

我又修改了makefile,还是不行:

 cat Makefile 
 LFLAGS += -L           /home/users/liuly/liuly/networksecurity/project/cplus/client/libStatic 
 LIBS = -lchilkat_x86_64  -lpthread
 GPP = g++ -g -std=c++0x
 TARGET = -o ns-client
 CPP = main.cpp Client.cpp TCPConnect.cpp Common_Protocol.h RSAsample.cpp TCPConnect.h Client.h RSAsample.h include/CkRsa.h

 all:
     $(GPP) $(LFLAGS)  $(TARGET) $(CPP) $(LIBS)

库问题(为不同的体系结构构建)很容易通过不使用您不需要的库来解决。如果要发布 makefile,则必须使用某种配置设置来确定正确的体系结构。如果它只是您自己的项目,请选择与您的系统匹配的项目(根据您的 makefile 的外观,x86_variant)。

错误CkRsa::exportPublicKey是由您的客户端代码引起的:官方符号是CkRsa::ExportPublicKey - 注意函数名开头的大写E

这是头文件: http://smart-refrigerator-hbnu.googlecode.com/svn/branches/kmy/RFID_CLIENT_/include/CkRsa.h

现在我明白为什么会这样了。我的教授告诉我从网上下载的静态库只用于MAC OS(我自己的笔记本是MAC),而我们学校的服务器是ubuntu。所以我需要下载ubuntu版本,否则我们的服务器无法识别静态库。 nm -a libchilkat_x86_64.a |less 使用此命令查看是否可以识别。 当我在我们的服务器上使用这个命令时,它显示:

nm: C_CkString.o: 无法识别文件格式等