解决方案: 感谢所有对此问题发表评论的人,但我在另一个论坛上解决了这个问题,并认为我会在这里为任何有相同问题的人发布答案。
所以,我想只有动态库才能使用__declspec(dllexport),因此当你尝试创建一个静态库时,会导出这些方法(名称需要被修改为c ++兼容),所以在声明extern时“C”__ declspec ....你最终得到了在尝试静态链接时无法识别的方法名称。
所以,简单修复.....删除__declspec
我有2个项目,一个是静态库,另一个是win32应用程序。
我只是想将我创建的库包含到我的win32应用程序中,但是g ++不断给我这个错误:
../ MyLib / TestClass.h:16:对 imp __ ZTV9TestClass'的未定义引用
这是我在尝试编译应用程序时遇到的错误,即使该文件是库的一部分。
我试图在尝试查找错误时尽可能创建此项目的最简化版本。
以下是两个项目的源文件:
MyLib.h - 这是客户端引用库中函数的主要包含文件
#ifndef MYLIB_H
#define MYLIB_H
#include "libexport.h"
#include "TestClass.h"
#endif /* MYLIB_H */
libexport.h - 用于定义导入/导出关键字的非常通用的文件
#ifndef LIBEXPORT_H
#define LIBEXPORT_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef LIB
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
}
#endif
#endif /* LIBEXPORT_H */
TestClass.h
#ifndef TESTCLASS_H
#define TESTCLASS_H
#include "libexport.h"
class DLL_EXPORT TestClass
{
public:
TestClass() {};
virtual ~TestClass() {};
void TestFunc();
};
#endif /* TESTCLASS_H */
TestClass.cpp
#define LIB
#include <stdio.h>
#include "TestClass.h"
void TestClass::TestFunc()
{
printf("This function was called from within the library.\n");
}
最后,实现库的win32应用程序:
Main.cpp的
#include <windows.h>
#include "../MyLib/MyLib.h"
#pragma comment(lib, "libmylib.a")
int __stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
TestClass *myClass = new TestClass();
delete myClass;
myClass = 0;
return 0;
}
库编译时没有错误,但是,这是编译主应用程序时的输出:
g++.exe -c -g -MMD -MP -MF build/Debug/MinGW-Windows/main.o.d -o build/Debug/MinGW-Windows/main.o main.cpp
mkdir -p dist/Debug/MinGW-Windows
g++.exe -mwindows -o dist/Debug/MinGW-Windows/testclient build/Debug/MinGW-Windows/main.o -L../MyLib/dist/Debug/MinGW-Windows -lmylib
build/Debug/MinGW-Windows/main.o: In function `TestClass':
C:\Users\Nick\Documents\NetBeansProjects\TestClient/../MyLib/TestClass.h:16: undefined reference to `_imp___ZTV9TestClass'
make[2]: Leaving directory `/c/Users/Nick/Documents/NetBeansProjects/TestClient'
build/Debug/MinGW-Windows/main.o: In function `~TestClass':
make[1]: Leaving directory `/c/Users/Nick/Documents/NetBeansProjects/TestClient'
C:\Users\Nick\Documents\NetBeansProjects\TestClient/../MyLib/TestClass.h:17: undefined reference to `_imp___ZTV9TestClass'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/MinGW-Windows/testclient.exe] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 1s)
我见过的关于这个主题的大多数其他帖子都说问题在于链接顺序,但即使将-lmylib添加到编译器构建行的开头,也会出现相同的错误:
g++.exe -lmylib -mwindows -o dist/Debug/MinGW-Windows/testclient build/Debug/MinGW-Windows/main.o -L../MyLib/dist/Debug/MinGW-Windows -lmylib
build/Debug/MinGW-Windows/main.o: In function `TestClass':
C:\Users\Nick\Documents\NetBeansProjects\TestClient/../MyLib/TestClass.h:16: undefined reference to `_imp___ZTV9TestClass'
我真的需要帮助,在使用上面的代码之前我已经构建了很多动态库,它没有任何问题,我无法理解为什么我在构建一个简单的静态库时遇到了这么多麻烦。非常感谢任何帮助。
答案 0 :(得分:2)
-L/path/to/library/
和-lName
因为g ++选项对我有用。不要在path/to/library
中指定库名称。
答案 1 :(得分:1)
尝试在链接命令行中将main.o放在-L和-l之前。
答案 2 :(得分:1)
解决方案:感谢所有评论过这个问题的人,但我在另一个论坛上解决了这个问题,并想出我会在这里为任何有相同问题的人发布答案。
所以,我想只有动态库才能使用__declspec(dllexport)
,所以当你尝试创建一个静态库时,会导出这些方法(名称需要被修改为C ++兼容),所以当声明时extern "C" __declspec....
您最终会遇到在尝试静态链接时无法识别的方法名称。
所以,简单修复:删除__declspec