标签: static-libraries

如何解决"错误LNK2019:未解析的外部符号"?

我有这个我正在研究的MFC应用程序需要有一个嵌入式数据库.所以我去寻找一个光滑,快速的"可嵌入"数据库,并且偶然发现了SQLite.

我用它创建了一个数据库,然后用Visual Studio 2008创建了一个静态库项目.库项目将用于另一个主项目.

在库项目中,我DBClass用方法创建了一个类AddFeedToDB(CFeed f).库项目使用.libcodeproject(cppsqlite3.lib)中的文件.

编译静态库时,没有检测到错误,但是当我尝试在主项目中使用库项目文件时,我得到以下类型的错误:

error LNK2019: unresolved external symbol "public:void __thiscall
   CppSQLite3DB::close(void)" (?close@CppSQLite3DB@@QAEXXZ 
   referenced in function "public: int __thiscall
   CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (?
   AddFeedToDB@CTalkingFeedsDB@@QAEHVCFeed@@PDB@Z
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

c++ linker static-libraries visual-c++

14
推荐指数
3
解决办法
8万
查看次数

减少Qt GUI应用程序的大小

我正在学习使用Qt Creator开发应用程序.我在Windows下构建了一个简单的应用程序,取决于使用mingwm10.dll,QtCore4.dll,QtGui4.dll,QtNetwork4.dll.在QtQui4.dll之外,我只使用了几个小部件,并且不需要所有其他的...是否可以缩小QtGui4.dll的大小或者做其他事情以减少应用程序的部署大小?静态链接怎么样?它会嵌入整个dll,还是只使用它的一部分?还有可能Qt静态地和一些动态链接一些dll吗?

c++ dll qt static-libraries

14
推荐指数
2
解决办法
7174
查看次数

从静态库中提取函数名称

我有一个静态库static_library.a

如何列出那里实现的功能和方法.或者至少如何看待"FUNCTION_NAME"实现的具体功能?

unix static-libraries extraction

14
推荐指数
2
解决办法
2万
查看次数

使用CMake和GCC在Mac上构建静态库?

问候所有,

我有一个静态库,我稍后将其与我的应用程序链接.我的开发环境是CMake,GCC(Linux,Mac),MinGW(Windows).

我可以在Linux和Windows上编译静态库而没有任何问题.(我甚至可以在Mac上的应用程序中构建共享库).

编辑:我将库编译为SHARED库,它运行良好!

我已按如下方式配置CMakeFile来构建静态库:

add_library(centi STATIC ${base_srcs} ${crv_srcs} ${node_srcs} ${trnk_srcs} ${defl_srcs} ${infl_srcs} ${track_srcs} ${callback_srcs} ${extract_srcs})
Run Code Online (Sandbox Code Playgroud)

在链接阶段,它会产生以下错误并以某种方式构建"libcenti.a".

Linking C static library
lib/libcenti.a /usr/bin/ranlib: file:
lib/libcenti.a(crv_in_rgn_to_bnry_img.c.o)
has no symbols /usr/bin/ranlib: file:
lib/libcenti.a(crv_initialize_by_circle.c.o)
has no symbols /usr/bin/ranlib: file:
lib/libcenti.a(crv_initialize_flgs.c.o)
has no symbols /usr/bin/ranlib: file:
lib/libcenti.a(crv_nodal_interval_min_and_max.c.o)
has no symbols /usr/bin/ranlib: file:
lib/libcenti.a(crv_remove_all_nodes.c.o)
has no symbols /usr/bin/ranlib: file:
lib/libcenti.a(crv_reset_nodal_forces.c.o)
has no symbols /usr/bin/ranlib: file:
lib/libcenti.a(crv_set_center_coords.c.o)
has no symbols /usr/bin/ranlib: file:
lib/libcenti.a(crv_set_left_ptch_rgn_pixs.c.o)
has no symbols /usr/bin/ranlib: file:
lib/libcenti.a(crv_set_out_rgn_mean_and_var.c.o)
has no symbols /usr/bin/ranlib: file:
lib/libcenti.a(crv_set_para.c.o) has …
Run Code Online (Sandbox Code Playgroud)

c++ macos gcc cmake static-libraries

14
推荐指数
3
解决办法
2万
查看次数

链接静态库,共享另一个静态库

我目前有一个非常大的代码库的Xcode项目,我称之为Project X,我将其划分为一堆子项目(项目A,B,C).

到目前为止,这些项目中的每一个都可以自行编译.它们都产生静态库.项目B项目C依赖于项目A生成的静态库以进行构建.

我有另一个xcode项目,Project Z,它需要Projects B和C生成的静态库.这就是问题所在.当Project Z进入链接器阶段时,事情就会爆发 - 在项目B和C的库中找到重复的符号,用于它们最初在项目A中链接的代码!

我对静态库世界很陌生,我不确定如何推进Project Z,或者如何修改其他项目以便它们链接到同一个Project A lib.我觉得这是不可能的.我有什么选择?

编辑:

我应该澄清,项目B项目C需要构建成单独的静态库,因为一些客户端只需要一个或另一个.

此外,我在OSX和iOS平台上都遇到了这种困境.

我意识到我可以通过将项目构建为动态库来解决OSX上的这个问题.但是,我不想这样做,它仍然让我在iOS上遇到同样的问题.

xcode linker static-libraries

14
推荐指数
1
解决办法
9999
查看次数

什么是减少objective-c中静态库大小的最佳实践?

在构建一个objective-c静态库时,我注意到.a文件(来自模拟器和iPhone的胖文件)非常大.特别是,它最初是5.7mb.我发现这篇文章并将我的构建设置设置Generate Debug Symbols为No,将lib大小减小到1.7mb.

这是一个很大的改进,但还有什么可以做的吗?实现和头文件单独占用~100kb.

xcode objective-c static-libraries ios

14
推荐指数
1
解决办法
4691
查看次数

为归档而构建的静态库,不是链接的体系结构(x86_64)

当我尝试编译两个不同的程序时,我遇到了似乎是同样的问题.他们每个人首先创建一个静态库,然后创建链接该库的主应用程序.我正在使用gcc 4.7.2在Mac OS Mavericks上工作.

计划1

这是我跑步时发生的事情make:

首先,库libfeat.a已创建,但我收到警告:

ar rc ../lib/libfeat.a imgfeatures.o utils.o sift.o kdtree.o minpq.o xform.o
ranlib  ../lib/libfeat.a
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: warning for library: ../lib/libfeat.a the table of contents is empty (no object file members in the library define global symbols)
Run Code Online (Sandbox Code Playgroud)

然后,在编译应用程序时,它表示它不能使用该库,因为它不是为相同的体系结构(x86_64)构建的:

gcc -O3 -I../include `pkg-config --cflags opencv` `pkg-config --cflags gtk+-3.0` `pkg-config --cflags gsl` siftfeat.c -o ../bin/siftfeat -L../lib -lfeat `pkg-config --libs opencv` `pkg-config --libs gtk+-3.0` `pkg-config --libs gsl`
ld: warning: ignoring file ../lib/libfeat.a, file was built for archive …
Run Code Online (Sandbox Code Playgroud)

c++ macos static-libraries unix-ar

14
推荐指数
3
解决办法
1万
查看次数

将PHP编译为静态二进制文件

我需要在一个PHP安装有点破坏的系统上运行php脚本.而不是尝试解决问题,我想用我自己的PHP二进制文件打包我的代码(我可以执行一个可执行文件).我想要一个简单的php二进制文件,它包含我需要编译的所有模块.我的一般过程是:

./configure --enable-static --enable-cli --disable-all
Run Code Online (Sandbox Code Playgroud)

这给了我一个没有扩展名的php二进制文件.从这里我可以添加我需要的扩展.例如,添加curl和json支持

./configure --enable-static --enable-cli --disable-all --with-curl --enable-json
Run Code Online (Sandbox Code Playgroud)

这似乎普遍适用.我的脚本需要libxml支持才能与AWS交互.所以我添加--enable-libxml --enable-simplexml了configure命令.当我将二进制文件复制到远程计算机时,尝试使用看起来像这样的XML库时会出错:

/usr/lib/x86_64-linux-gnu/libxml2.so.2: version `LIBXML2_2.9.0' not found
Run Code Online (Sandbox Code Playgroud)

显然它是动态链接到libxml2.我认为这意味着虽然PHP扩展被静态编译为PHP,但PHP扩展正在使用的库不是.运行ldd确认了这一点:

$ ldd sapi/cli/php
linux-vdso.so.1 =>  (0x00007fff05cf3000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f3c69f82000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f3c69d68000)
libcurl.so.4 => /lib64/libcurl.so.4 (0x00007f3c69afc000)
librt.so.1 => /lib64/librt.so.1 (0x00007f3c698f4000)
libm.so.6 => /lib64/libm.so.6 (0x00007f3c695ed000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f3c693e8000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f3c691cf000)
libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f3c68e66000)
libz.so.1 => /lib64/libz.so.1 (0x00007f3c68c4f000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3c68890000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f3c6860f000)
libidn.so.11 => /lib64/libidn.so.11 (0x00007f3c683db000)
libssh2.so.1 => /lib64/libssh2.so.1 (0x00007f3c681b1000) …
Run Code Online (Sandbox Code Playgroud)

php compilation static-libraries

14
推荐指数
1
解决办法
6391
查看次数

包括来自静态库的头文件

我正在进行C静态库和程序的测试设置.库代码位于我项目的子目录'foo'中,包含以下文件:

富/ foo.c的:

#include <stdio.h>
void foo(void) {
    printf("something");
}
Run Code Online (Sandbox Code Playgroud)

富/ foo.h中:

#ifndef foo_h__
#define foo_h__
extern void foo(void);
#endif
Run Code Online (Sandbox Code Playgroud)

我的程序代码如下:

test.c的:

#include "foo.h"
int main() {
    foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有一个名为"build"的构建脚本,其中包含以下内容:

建立:

#!/bin/bash
gcc -c -Wall -Werror foo/foo.c
ar rcs libfoo.a foo.o
gcc -static -o test test.c libfoo.a # I have also tried -L. -lfoo
Run Code Online (Sandbox Code Playgroud)

但是当我运行build时,它会给我以下错误:

test.c:1:17: fatal error: foo.h: No such file or directory
  #include "foo.h"
                  ^
Compilation terminated
Run Code Online (Sandbox Code Playgroud)

但是,当我省略#include行时,它确实有效,但我更喜欢在静态库中使用头文件.我做错了什么,我该如何解决?

c gcc header-files static-libraries .a

14
推荐指数
1
解决办法
3万
查看次数

必需的框架与静态库

构建现代框架每个应用程序都有自己的自定义框架副本.现在,Xcode的支持iOS的框架,它仍然是真实的框架静态库只是更方便?如果这是真的,那么为什么选择静态库模板呢?否则,一旦Swift支持静态库,我应该将所有必需的自定义框架转换为静态库吗?

frameworks static-libraries ios swift

14
推荐指数
2
解决办法
1万
查看次数