标签: static-linking

如何在C++代码中使用CityHash128?

我正在尝试使用谷歌的 cityhash 哈希函数。我无法将它链接到我的 C++ 代码。我已经安装了 cityHash,它在我的 /usr/local/lib 中生成了 libcityhash.la 等文件。

\n\n

我正在设置 LD_LIB_LIBRARY=/usr/local/lib,但它似乎没有链接到这些文件。

\n\n

代码:

\n\n
#include <iostream>\n#include <fstream>\n#include <cstdlib>\nint main()\n{\n    std::ifstream file("dev/urandom");\n    char buff[4096];\n    file.read(buff, 4096);\n    const uint128 hashed = CityHash128(buff,4096);\n    file.close();\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n\n

编译:
\n g++ -o city cityHash.cpp

\n\n

错误:
\n /tmp/cctSoHTX.o: 在函数 main:\ncityHash.cpp:(.text+0x73): 未定义引用 `CityHash128(char const*, unsigned long)\'\ncollect2: 错误: ld 返回 1退出状态

\n\n

我包含“city.h”并尝试按如下方式编译它:

\n\n

g++ -I /usr/local/include/ -L/usr/local/lib -llibcityhash.a cityHash.cpp -o city

\n\n

但我仍然得到:对 `CityHash128(char const*, unsigned long)\' \xe2\x80\x93 的未定义引用

\n

c++ static-linking g++4.8

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

如何静态链接 Qt 库?

我想将 Qt 库静态链接到我的程序,以便它可以在我学校的计算机上运行。我们没有打算在这些计算机上安装任何东西,因此静态链接是我唯一的机会。

到目前为止,这是我的 cmake 文件

cmake_minimum_required(VERSION 3.9)

project(Calculator)

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -Wall -Wpedantic -Wextra -std=gnu++14 -no-pie -fPIC  -static -lQt5Widgets -lQt5Gui -lQt5Core")

find_package(Qt5Widgets REQUIRED)
include_directories(/usr/include/qt/QtWidgets /usr/include/qt /usr/include/qt/QtGui /usr/include/qt   /usr/include/qt/QtCore /usr/include/qt)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

add_executable(${PROJECT_NAME} main.cpp calculator.cpp  resources.qrc calculatestring.cpp )
Run Code Online (Sandbox Code Playgroud)

这是我尝试运行此 cmake 文件时得到的结果:-

/bin/ld: cannot find -lQt5Widgets
/bin/ld: cannot find -lQt5Gui
/bin/ld: cannot find -lQt5Core
Run Code Online (Sandbox Code Playgroud)

如果我删除-static标志,它编译得很好,但只能在安装了 qt 的机器上运行。

当我尝试在没有安装 qt 的 Arch Linux 的 VirtualMachine 上运行它时,它给了我错误:-

error while loading shared libraries : libQt5Widgets.so.5: …
Run Code Online (Sandbox Code Playgroud)

c++ qt static-linking

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

使用 gcc / mingw 时,我应该如何链接到静态 wxWidgets 库?

这相当令人沮丧,最常见的答案是“做 CodeBlocks 所做的事情”。我不在乎。我想明白。

问题是:wxWidgets 在非整体构建时被拆分到多个静态库中。这些必须根据它们的依赖关系以正确的顺序链接,否则静态链接将失败。

这些库是(它们的文件名是缩写的,但为了简单起见,我使用了它们的全名):

wxAdvanced
wxAui
wxBase
wxCore
wxGL
wxHTML
wxMedia
wxNet
wxPropertyGrid
wxQA
wxRibbon
wxRichText
wxSTC
wxWebView
wxXML
wxXRC
Run Code Online (Sandbox Code Playgroud)

什么是魔术顺序,我们可以在哪里查找 - 最重要的是:它如何归入我的项目CMakeLists.txt

下面显示了一些具有代表性的错误消息 - 也许它们会使通过网络搜索更容易发现此问答:

C:/wxwidgets-install_3.1.3_9/lib/gcc_x64_lib/wxmsw31ud_aui.a(floatpane.cpp.obj):floatpane.cpp:(.rdata$.refptr._ZN11wxMiniFrame12ms_classInfoE[.refptr._ZN11wxMiniFrame12ms_classInfoE]+0x0): undefined reference to `wxMiniFrame::ms_classInfo'

C:/wxwidgets-install_3.1.3_9/lib/gcc_x64_lib/wxmsw31ud_core.a(window.cpp.obj):window.cpp:(.rdata$.refptr.wxEVT_POWER_RESUME[.refptr.wxEVT_POWER_RESUME]+0x0): undefined reference to `wxEVT_POWER_RESUME'

src/CMakeFiles/wxmaxima.dir/Unity/unity_10.cxx.obj: In function `XmlInspector::XmlInspector(wxWindow*, int)':
C:/projects/wxMaxima/src/XmlInspector.cpp:42: undefined reference to `wxRichTextCtrl::wxRichTextCtrl(wxWindow*, int, wxString const&, wxPoint const&, wxSize const&, long, wxValidator const&, wxString const&)'
Run Code Online (Sandbox Code Playgroud)

wxwidgets mingw static-linking

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

在 C++ 编译期间提供链接库路径的 linux 命令是什么?

我记得看到过一些像这样工作的命令:

g++ main.cpp `some_forgotten_command --some_forgotten_options some_library`
Run Code Online (Sandbox Code Playgroud)

当命令运行时,它将用-I/path/to/some_library/includeand替换 `` 括起来的部分-L/path/to/some_library/lib/(或者类似的东西,我不太记得了)。但我不记得是什么some_forgotten_command了。

c++ linux linker dynamic-linking static-linking

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

将库添加到 MFC 项目

所以这可能是非常基本的,但是当你找到一份你不完全胜任的工作时就会发生这种情况,对吗?

我有一个 MFC 项目,一切都运行良好,但我正在尝试将 string 和 stringstream 指令添加到项目中。

无论我放在哪里#include <string>#include <sstream>我都会收到“字符串:未声明的标识符”错误。

提前致谢?:D

c++ mfc static-linking

0
推荐指数
1
解决办法
4380
查看次数

如何在MSVC中静态链接库?

我正在Microsoft Visual C++ 10中编译我的程序,它使用PDCurses库.我已将其配置为与pdcurses.lib链接,但当我尝试运行该应用程序时,系统会抱怨它无法找到"pdcurses.dll".它不应该抱怨它.我曾经使用MinGW(GCC)编译程序,当我尝试运行应用程序时它并没有问我任何DLL.我能做些什么让MSVC静态链接PDCurses?

c++ pdcurses static-linking visual-c++

0
推荐指数
1
解决办法
2505
查看次数

向Makefile添加功能会产生错误: - "这里有多个definitoon ......"

我已经获得了一个已经正常工作的Makefile,它实际上工作正常.

Makefile内容可以在这篇文章中找到...

关于Makefile的问题 - 什么是"$ +"以及这里调用的.c文件/依赖项在哪里?

我从上面提到的上一篇文章中分别提出这个问题,因为它涉及一个不同的问题,并将其添加到该问题将不必要地增加其长度.

现在我添加了一个在很多地方经常使用的功能,所以我认为创建一个单独的文件将是一个不错的主意,所以我创建linklayer.c并添加linklayer.o$LIBOBJS.

我加了这个......

 LIBOBJS= linklayer.o csum.o compact.o protoname.o headers.o 
 parseargs.o cryptomod.o crc32.o
Run Code Online (Sandbox Code Playgroud)

还有这个

 linklayer.o:    linklayer.c
    $(CC) -o $@ -c -I. $(CFLAGS) $+
Run Code Online (Sandbox Code Playgroud)

我已经声明了sendip_module.h已经在项目中存在的每个模块中声明和访问的函数.

但现在这个多重定义错误即将来临......我做错了什么或误解了什么?

注意: "ipv6_opts"在ipv6.h中定义

$ make all
for subdir in mec ; do \
    cd $subdir ;\
    make  ;\
    cd ..  ;\
    done
make[1]: Entering directory `/home/udit/Desktop/sendip-2.5-mec-2/mec'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/home/udit/Desktop/sendip-2.5-mec-2/mec'
  gcc-4.4 -o ipv6.so -fPIC -fsigned-char -pipe …
Run Code Online (Sandbox Code Playgroud)

gcc makefile static-libraries static-linking

0
推荐指数
1
解决办法
340
查看次数

MSBuild.ILMerge.Task不允许重复类型

我通过调用ILMerge收到以下错误.

ILMerge.Merge:ERROR !!:在程序集"System.Net.Http.Formatting"中找到重复类型"System.Net.Http.HttpRequestMessageExtensions".你想使用/ alllowDup选项吗?

你会认为这很容易解决.错误消息说明要做什么.

但是我对ILMerge的调用是由MSBuild.ILMerge.Task完成的

似乎我已经做了我需要做的事情来实现这一目标......

从我的ILMerge.props文件:

<!-- added in Version 1.0.4, default=none -->
<ILMergeAllowDuplicateType>true</ILMergeAllowDuplicateType>
Run Code Online (Sandbox Code Playgroud)

`我收到有关此属性文件验证的警告,但没有任何其他方法可以阻止构建.那么将它传达给ILMerge需要什么?

.net c# msbuild ilmerge static-linking

0
推荐指数
1
解决办法
1512
查看次数

将静态变量从CPP文件访问到其他头文件

我正在尝试从CPP文件访问其他头文件中的静态变量。

Boo.hpp

#ifndef Boo_hpp
#define Boo_hpp

static int num;

class Boo
{
public:
    Boo()
    {
        num = 35;
    }
};

#endif /* Boo_hpp */
Run Code Online (Sandbox Code Playgroud)

Foo.hpp

#ifndef Foo_hpp
#define Foo_hpp

class Foo
{
public:
    Foo();
};

#endif /* Foo_hpp */
Run Code Online (Sandbox Code Playgroud)

Foo.cpp

#include "Foo.hpp"
#include "Boo.hpp"
#include <iostream>

Foo::Foo()
{
    std::cout << "Num : " << num << '\n';
}
Run Code Online (Sandbox Code Playgroud)

main.cpp

#include <iostream>
#include "Foo.hpp"
#include "Boo.hpp"

int main()
{
    Boo boo;
    Foo foo; …
Run Code Online (Sandbox Code Playgroud)

c++ static-linking

0
推荐指数
2
解决办法
609
查看次数

是否可以将多个静态库捆绑到一个静态库 [C++] 中?

我为我的 C++ 代码创建了一个静态库,它依赖于 CentOS 7 环境中的 Boost、OpenSSL、CURL 和线程。

是否可以将libboost_system.a, libssl.a, libcrypto.a, libcurl.a,libpthread.a与我的 C++ 库一起捆绑到一个库中?

c++ static-linking

0
推荐指数
1
解决办法
25
查看次数

静态链接 - 使用GTKmm应用程序? - 修订

是否可以在Gtk(mm)程序上进行静态链接(编译)?我需要程序减少对用户系统依赖性的干扰.

我尝试:

g++ -static data/Area.h data/Picture.cpp data/GLScene.cpp data/KBDialog.cpp data/Dialogs.h data/FilePreview.cpp data/MainWindow.cpp prog.cpp -o prog `pkg-config --cflags --libs  gtkmm-2.4 gtkglextmm-1.2 exiv2`
Run Code Online (Sandbox Code Playgroud)

但它失败了:

/usr/bin/ld: cannot find -lgtkmm-2.4
/usr/bin/ld: cannot find -lGL
/usr/bin/ld: cannot find -latkmm-1.6
/usr/bin/ld: cannot find -lgdkmm-2.4
/usr/bin/ld: cannot find -lpangomm-1.4
/usr/bin/ld: cannot find -lgdk_pixbuf-2.0
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/libgio-2.0.a(glocalfileinfo.o): In function `lookup_gid_name':
(.text+0x207a): warning: Using 'getgrgid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/libgio-2.0.a(glocalvfs.o): In function `g_local_vfs_parse_name':
(.text+0x26c): warning: Using 'getpwnam' in statically …
Run Code Online (Sandbox Code Playgroud)

c++ linux gtk gtkmm static-linking

-2
推荐指数
2
解决办法
3485
查看次数

如何在C/C++应用程序中静态链接库?

我正在尝试在我的应用程序中链接一个名为'twitcurl.lib'的库.我尝试过在网上研究一些事情并没有多少出现,或者说它很混乱.老实说,我对此完全陌生 - 关于如何创建此链接的​​任何想法?

c c++ static-linking

-2
推荐指数
1
解决办法
217
查看次数

为什么动态库可以链接到其他库,但静态库不能?

请考虑以下代码结构:

main.cpp -> depends on libone.a -> depends on libtwo.a

假设main.cpp仅使用函数libone.a.所以现实地,程序员写作main.cpp真的只关心libone.a.在这一点上,他们甚至不知道libone.a有依赖libtwo.a.

他们尝试按如下方式编译代码并获取链接器错误:

g++ -o main main.cpp -lone

在此输入图像描述 - 错误!未定义的符号!

这成为一个问题,因为libone.a依赖于libtwo.a,任何使用的人都libone.a必须知道这种依赖关系...正如你可以想象的那样,FAR可能会出现这个问题,而不是单个库的FAR更多的依赖关系,并且很快就会成为一个链接噩梦.


尝试1解决此问题:

第一种认为,解决这个问题是"很简单,我会只是链接libone.alibtwo.a当我编译libone.a!

事实证明它并不像我希望的那么简单......编译libone.a时无法链接libtwo.a.编译它们时,静态库不会链接到任何内容,而是在将库编译为可执行文件时必须链接所有依赖项.

例如,要编译main.cpp依赖于静态库,而静态库又依赖于另一个静态库,则必须链接这两个库.总是.

g++ -o main main.cpp -lone -ltwo


尝试2解决此问题:

另一个想法是尝试编译libone为链接到的动态库libtwo.a.

奇怪的是,这才有效!编译和链接libone.so主程序后,只需要关心libone.so,不再需要了解libtwo.a.

g++ -o main main.cpp -lone

成功!


经过这个练习后,仍然缺少一件.我似乎无法弄清楚为什么静态库不能在其他库中链接,但动态库可以.事实上,动态库 …

c++ linker dynamic-linking static-linking

-2
推荐指数
1
解决办法
65
查看次数