我有一个静态库,其中(除其他外)实现了一个微小的函数,只返回一个const字符串表中的字符串.此函数不会在库中的任何位置调用,但仍然声明为inline.为清楚起见,它看起来像这样:
namespace flow
{
inline const char* GetName( BYTE methodType );
}
Run Code Online (Sandbox Code Playgroud)
和实施:
const char* flow::GetName( BYTE methodType )
{
if ( methodType < 5 )
return cszNameTable[ methodType ];
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
在另一个项目中,我正在链接这个库.我有正确的.h文件,我有using namespace flow;我的代码.问题是,我收到链接器错误:
error LNK2001: unresolved external symbol "char const * __cdecl flow::GetName(unsigned char)" (?GetName@flow@@YAPBDE@Z)
Run Code Online (Sandbox Code Playgroud)
现在我可以通过从静态库中的函数声明中删除"inline"关键字来轻松解决此问题.所以这是我的问题:
1)为什么会出现此错误?如何在不修改静态库源代码的情况下修复它(不删除内联关键字)?
2)inline在未在库本身内部调用的静态库函数中使用关键字有什么好处?inline当从另一个项目链接到库时,关键字是否有任何影响(我猜它确实如此,但我不确定)?
我用几个创建了我的lib.a文件
gcc -c file.c -o file.o
Run Code Online (Sandbox Code Playgroud)
然后
ar sr lib/libtest.a file1.o file2.o file3.o
Run Code Online (Sandbox Code Playgroud)
确认
ar -t lib/libtest.a
file1.o
file2.o
file3.o
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译测试应用程序时
gcc lib/libtest.a test.c -o test
Run Code Online (Sandbox Code Playgroud)
我在函数中得到了未定义的引用main:来自file1.o,file2.o,file3.o的函数
我已经看到了类似于这个问题的问题,但情景并不完全相同,我也无法找到适用于我的问题的答案.
我有一个C++库的源代码.我们需要将此库用作Android应用程序的一部分,但它也需要可供第三方用作C++库.
我有一个makefile,使用ndk的编译器从库的源代码生成.a文件.那是纯粹的C++部分.
在Java部分,我有一个简单的演示项目,其中包含一个包含按钮的简单活动.按下按钮时,将调用本机代码.
只要我不尝试从JNI函数调用库中的函数,一切正常.
以下是图书馆的来源:
SimpleMath.h
int Add(int aNumber1, int aNumberB);
Run Code Online (Sandbox Code Playgroud)
SimpleMath.cpp
#include "SimpleMath.h"
int Add(int aNumberA, int aNumberB)
{
return aNumberA + aNumberB;
}
Run Code Online (Sandbox Code Playgroud)
在生成文件
APP = simple_app
LIBRARY = simple_library.a
OBJECTS = SimpleMath.o
CFLAGS = -Wall -pedantic
NDK_PATH = /home/jug/perforce/jug_navui_personal_main/Env/Linux/Android/ndk/r7c
CXX = $(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++
AR = $(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ar
SYSTEM_LIBS = -lstdc++ -lm
INCLUDE_PATH += ${NDK_PATH}/platforms/android-9/arch-arm/usr/include
all: $(LIBRARY)
$(LIBRARY):
$(CXX) -c SimpleMath.c
$(AR) rcs simple_library.a SimpleMath.o
clean:
rm *.o *.a
Run Code Online (Sandbox Code Playgroud)
在java方面,这些是文件:
你好,jni.c
#include <string.h>
#include <jni.h>
#include "../../../native/simple_library/SimpleMath.h"
jstring …Run Code Online (Sandbox Code Playgroud) 所以我正在使用3dar SDK,构建一个实现sdk和生成的SM3Dar.h头的独立应用程序没有问题.但是现在我正在尝试使用相同的sdk作为更大项目的一部分,它似乎没有正常运行.看起来它知道头文件在那里但是没有与那个和库正确通信.我正试图在iPhone 5上运行它,我有最新的XCode.
但我收到这些错误
Undefined symbols for architecture armv7s:
"**___cxa_pure_virtual", referenced from**:
vtable for Comparable in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
"**vtable for __cxxabiv1::__si_class_type_info", referenced from:**
typeinfo for ComboVertex in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
typeinfo for ObjDB in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(ObjDB.o)
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
**"operator new[](unsigned long)", referenced from:**
Array<FloatPolygon>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(Geometry.o)
Array<FloatVertex>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(Geometry.o)
Array<CString>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(ObjFile.o)
Array<Vector3>::resize(int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
Array<Vector3>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
Array<unsigned char>::resize(int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o)
Array<unsigned char>::Array(int, int) in lib3DAR_v23_2012_12_06_DistributionPatch_2013_05_18.a(FloatObject.o) …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个静态库,作为网络设备的API发布.我可以成功编译和链接库以生成.lib输出文件,并将它们重定位到目录结构中,如下所示:
EyeLib
L-Include
| L-PublicInterface.h
L-Lib
| L-debug
| | L-MyLib.lib
| | L-MyLib.pdb
| L-release
| L-MyLib.lib
L-MyLibConfig.cmake
Run Code Online (Sandbox Code Playgroud)
MyLibConfig.cmake文件非常简单,包含:
# the header file is relative to this cmake file, so get the path.
GET_FILENAME_COMPONENT( MyLib_TOPLEVEL_DIR ${CMAKE_CURRENT_LIST_FILE} PATH )
SET( MyLib_INCLUDE_DIR ${MyLib_TOPLEVEL_DIR}/include )
IF( WIN32 )
FIND_LIBRARY( MyLib_DEBUG_LIBRARY MyLib ${MyLib_TOPLEVEL_DIR}/lib/debug )
FIND_LIBRARY( MyLib_RELEASE_LIBRARY MyLib ${MyLib_TOPLEVEL_DIR}/lib/release )
SET( MyLib_LIBRARIES optimized ${MyLib_RELEASE_LIBRARY} debug ${MyLib_DEBUG_LIBRARY} )
ENDIF( WIN32 )
IF( UNIX )
FIND_LIBRARY( MyLib_LIBRARY MyLib ${MyLib_TOPLEVEL_DIR}/lib )
SET( MyLib_LIBRARIES "${MyLib_LIBRARY}" )
MARK_AS_ADVANCED( MyLib_LIBRARY …Run Code Online (Sandbox Code Playgroud) boost cmake static-libraries visual-studio visual-studio-2012
假设我有一个大整数的类型Integer.是否存在一个库功能(在前奏或其他地方),该给定的时Integer X将返回的平方根的整数部分X为Integer?
math haskell static-libraries square-root arbitrary-precision
有一个lib文件.h,它与一些设备驱动程序一起使用.Visual Studio C++项目示例使用该库作为静态链接.
从该库导出的函数只有2个.
HANDLE open_dev();
HANDLE open_file( char *filename );
Run Code Online (Sandbox Code Playgroud)
我想在我的C#项目中使用该库,并再次静态链接它.怎么可能?
我正在阅读一篇关于c ++库和静态/动态库和链接的文章.我的问题如下:
1)我们必须编译要插入到库中的文件,然后使用命令ar -crsv创建库文件?(是必须以lib开头并以.a结尾的存档吗?)
2)g ++的命令-I和-L一次使用?向编译器"说"到哪里是库?或者每次编译使用库的源代码?
3)必须使用#include <>包含Libray?如果是的话用什么名字?
我不太了解静态库和静态链接的含义以及动态链接的含义是什么?我所理解的是,使用静态库和链接是指我们将程序与库合并,以便在原始位置不需要原始库?对于Dynamic,我所知道的是代表动态链接库的DDl.那么我能想到的这个DDL的唯一区别是加载到主内存中,但我很困惑
任何有知识的人都可以把我的 - 可能是错的 - 知识变成正确的顺序并解释更多这个术语吗?
谢谢!
我正在构建一个静态库,但是,当我将它链接到一个演示项目(基本的单一视图应用程序)时,我没有收到任何编译错误.我无法进入从静态库调用的方法来调试它...
我没有收到任何运行时错误,但我认为这是因为它没有被执行,因为我的NSLog没有被显示,并且它没有返回任何东西......
基本上,我如何调试我通过我也创建的演示应用程序创建的静态库..
我该怎么办?我需要帮助!!
提前致谢...
所以这是我正在使用的回购:https://github.com/Garuda1/unixlib
我想知道我编译的lib(unixlib.a)和我的header(unixlib.h)应该在哪里,以便能够使用lib(在Linux-x86或Linux-x86_64下),只需编译:
$ gcc my_source.c -lunixlib
Run Code Online (Sandbox Code Playgroud)
并包括标题my_source.c.
我想我添加这样做Makefile:
install:
mv $(NAME).a $(LIB_PATH)
mv unixlib.h $(HEADER_PATH)
Run Code Online (Sandbox Code Playgroud)
但我不知道是什么$(LIB_PATH),并$(HEADER_PATH)有...