我正在尝试使用谷歌的 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();\nRun Code Online (Sandbox Code Playgroud)\n\n}
\n\n编译:
\n g++ -o city cityHash.cpp
错误:
\n /tmp/cctSoHTX.o: 在函数 main:\ncityHash.cpp:(.text+0x73): 未定义引用 `CityHash128(char const*, unsigned long)\'\ncollect2: 错误: ld 返回 1退出状态
我包含“city.h”并尝试按如下方式编译它:
\n\ng++ -I /usr/local/include/ -L/usr/local/lib -llibcityhash.a cityHash.cpp -o city
但我仍然得到:对 `CityHash128(char const*, unsigned long)\' \xe2\x80\x93 的未定义引用
\n我想将 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) 这相当令人沮丧,最常见的答案是“做 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) 我记得看到过一些像这样工作的命令:
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了。
所以这可能是非常基本的,但是当你找到一份你不完全胜任的工作时就会发生这种情况,对吗?
我有一个 MFC 项目,一切都运行良好,但我正在尝试将 string 和 stringstream 指令添加到项目中。
无论我放在哪里#include <string>,#include <sstream>我都会收到“字符串:未声明的标识符”错误。
提前致谢?:D
我正在Microsoft Visual C++ 10中编译我的程序,它使用PDCurses库.我已将其配置为与pdcurses.lib链接,但当我尝试运行该应用程序时,系统会抱怨它无法找到"pdcurses.dll".它不应该抱怨它.我曾经使用MinGW(GCC)编译程序,当我尝试运行应用程序时它并没有问我任何DLL.我能做些什么让MSVC静态链接PDCurses?
我已经获得了一个已经正常工作的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) 我通过调用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需要什么?
我正在尝试从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++ 代码创建了一个静态库,它依赖于 CentOS 7 环境中的 Boost、OpenSSL、CURL 和线程。
是否可以将libboost_system.a, libssl.a, libcrypto.a, libcurl.a,libpthread.a与我的 C++ 库一起捆绑到一个库中?
是否可以在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) 我正在尝试在我的应用程序中链接一个名为'twitcurl.lib'的库.我尝试过在网上研究一些事情并没有多少出现,或者说它很混乱.老实说,我对此完全陌生 - 关于如何创建此链接的任何想法?
请考虑以下代码结构:
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更多的依赖关系,并且很快就会成为一个链接噩梦.
第一种认为,解决这个问题是"很简单,我会只是链接libone.a与libtwo.a当我编译libone.a!
事实证明它并不像我希望的那么简单......编译libone.a时无法链接libtwo.a.编译它们时,静态库不会链接到任何内容,而是在将库编译为可执行文件时必须链接所有依赖项.
例如,要编译main.cpp依赖于静态库,而静态库又依赖于另一个静态库,则必须链接这两个库.总是.
g++ -o main main.cpp -lone -ltwo
另一个想法是尝试编译libone为链接到的动态库libtwo.a.
奇怪的是,这才有效!编译和链接libone.so主程序后,只需要关心libone.so,不再需要了解libtwo.a.
g++ -o main main.cpp -lone
成功!
经过这个练习后,仍然缺少一件.我似乎无法弄清楚为什么静态库不能在其他库中链接,但动态库可以.事实上,动态库 …