这不是一个彻底的技术问题,但我想知道是否有一种更简单的方法来查找特定语言及其设施的系统中存在的所有库......类似手册页的东西会很棒,但要寻找信息,你首先要知道那里存在什么。(例如第三方库......)
我的方式:对于 C 或 CPP - 我知道是否有像 gcc 或 g++ 这样的编译器,所有标准库都作为编译器本身的一部分安装,因此我可以简单地查看手册的第 2 - 3 节,但这些是标准库,您还可以将它们作为 C 和 CPP 书籍的一部分来阅读。
我真正感兴趣的是找到一种方法来发现我不知道的库并尝试了解它们。像 boost 这样的第 3 方库可以/可能在 /usr/bin 这样的地方找到...所以我正在查找 libXXX.a 或 .so 文件,然后通过 google 查找它是什么以及在哪里以及如何找到它可以使用它......但这感觉很愚蠢:(
一定有更简单的方法来找到东西吗?
PS:我不是机器的所有者,所以我自己不进行安装,想想工作/大学服务器......很多人都访问它。,顺便说一下操作系统是Solaris 9
我尝试使用 , 构建一个独立程序static lib。libcurl.lib但我遇到了一堆错误。
我曾经参考过stackoverflow和libcurl主页上的相关帖子,不幸的是到目前为止都是徒劳的。
以下是我的构建过程和收到的错误消息。
请评论。万分感谢,
1. Build curl from source code
nmake /f Makefile.vc mode=static VC=14 ENABLE_SSPI=no ENABLE_IPV6=no ENABLE_IDN=no GEN_PDB=no DEBUG=no MACHINE=x64
2. Build main.obj CimXml.obj CimCurl.obj getpass.obj
"cl -I.\include -DCURL_STATICLIB -EHsc -c main.cpp CimXml.cpp CimCurl.cpp getpass.cpp"
3. Build a "STATIC" library cimxml.lib
"lib CimXml.obj CimCurl.obj getpass.obj /out:cimxmlcurl.lib"
4. Build the alc.exe
"cl -DCURL_STATICLIB -I.\include main.obj cimxmlcurl.lib libcurl_a.lib /link /LIBPATH:.\lib /verbose:lib /out:alc.exe"
Run Code Online (Sandbox Code Playgroud)
错误信息:
C:\Users\nick\Documents\sblim-wbemcli-1.6.3-Beta>cl -DCURL_STATICLIB -I.\include main.obj cimxmlcurl .lib libcurl_a.lib /link /LIBPATH:.\lib /verbose:lib /out:alc.exe …Run Code Online (Sandbox Code Playgroud) 假设我们需要编写一个我们打算在我们的程序中使用的函数库,那么我们可以通过以下方式编写它。
在 .h 文件中,我们声明函数(mylibrary 可以是我们希望的任何文件名)假设 sum 是我们希望在我们的库中拥有的函数
int sum(int x, int y);
Run Code Online (Sandbox Code Playgroud)
然后我们将有一个 .cpp 文件,它将定义如下函数:
#include "mylibrary.h"
int sum(int x, int y){ return x+y; }
Run Code Online (Sandbox Code Playgroud)
现在我们希望在我们的程序中使用这个函数,比如 myprog.cpp,我们可以这样使用:
#include
#include "mylibrary.h"
int main()
{
cout<<sum(10,20)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我们可以像对函数那样对类做类似的事情,即
我们可以在 .h 文件中声明类,例如:
class X;
class Y;
Run Code Online (Sandbox Code Playgroud)
然后在 .cpp 中定义类,如:
#include"myclasses.h"
class X
{
public:
int m;
};
class Y
{
public:
int n;
};
Run Code Online (Sandbox Code Playgroud)
然后在我们的程序中使用这些类,比如 myprog.cpp,像这样:
#include"myclasses.h"
int main()
{
class X myX;
myX.m = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试过了,得到了错误聚合“X myX”的类型不完整,无法定义。 …
当您想使用 g++ 静态链接所有可用库时,此人会将-static标志传递给编译器。
但是如何从 Qt Creator 做到这一点呢?
首先,我尝试了这个建议: 如何使 Qt 和 Qtcreator 静态而不是动态链接库?
该帖子建议使用
CONFIG += static
Run Code Online (Sandbox Code Playgroud)
但这根本行不通。
其次,我尝试了另一种方法并将以下行添加到我的 .pro 文件中:
QMAKE_CXXFLAGS += -static
Run Code Online (Sandbox Code Playgroud)
那也没有解决问题。我分析了编译器输出并发现:
-static 标志仅在将源编译为目标文件时添加。但是在构建可执行文件时,此标志不存在。
以下是我从编译器输出选项卡复制的确切编译器命令:
g++ -c -pipe -fno-keep-inline-dllexport -static -g -std=gnu++11 -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_QML_DEBUG -I..\..\..\ASSETS\PROG_CPP\MY_CPP\2016\test -I. -I..\..\..\icu\dist\include -I..\..\5.7\mingw53_32\mkspecs\win32-g++ -o debug\main.o ..\..\..\ASSETS\PROG_CPP\MY_CPP\2016\test\main.cpp
g++ -Wl,-subsystem,console -mthreads -o debug\test.exe debug/main.o -LC:\icu\dist\lib -lsicuio -lsicuin -lsiculx -lsicule -lsicuuc C:\icu\dist\lib\sicudt.a -lpthread -lm
Run Code Online (Sandbox Code Playgroud)
如何强制 Qmake 将 -static 添加到所有命令?
我正在尝试将我的 C++ 变成一个 .lib 文件以用于我的项目。
我有文件Log.h和Log.cpp.
我走进我的项目属性在Visual Studio和更改的配置类型.exe来.lib。我将构建模式设置为Release并将我的类构建到一个名为Log.lib.
在一个新的 C++ 项目中,我试图包含.lib我与Log.h文件一起制作的那个文件。一切都成功了,它识别了我的功能,但是当我尝试使用我的 include 运行我的 exe 程序时Log.h,我收到以下错误:
mismatch detected for '_ITERATOR_DEBUG_LEVEL':
value '2' doesn't match value '0' in main.obj
Run Code Online (Sandbox Code Playgroud)
通过引用这篇stackoverflow 帖子,我发现在Release模式(与模式相同.lib)中构建和运行我的新项目可以消除错误,并且我可以成功运行我的程序并使用Log.h.
如何编译我的Log.h库以与Debug和兼容Release?
我正在研究一个复杂的 C 生态系统,其中不同的包/库由不同的人开发。
我想创建一个名为 的新项目foobar。该项目使用了两个库, 库foo和 库bar。
不幸的是,bar不需要与foo需要的版本相同的版本。两者都使用say所以有冲突。
如果所有包都位于带有子模块的 Git 上,则foobar递归克隆时无法构建项目,因为两个say函数存在于不同的翻译单元中。所以这个submodule策略行不通。
我的问题是:如何管理一个使用同一静态库()的两个不同版本的项目?*.a
foobar
|
.----'----. <---- (require)
v v
foo bar
(v1.0) | | (v2.0)
'-> say <-'
Run Code Online (Sandbox Code Playgroud)
项目 foobar 需要 库foo和 库bar,这两个库都使用say包:foo需要版本 1 和bar需要版本 2。
// say.h
void say(char …Run Code Online (Sandbox Code Playgroud) Now i create a new project include c++ support in Android Studio 3.2, it has native-lib.cpp naturally, the CMakeLists.txt looks like this:
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp)
Run Code Online (Sandbox Code Playgroud)
now if i build this project, i can find libnative-lib.so in some "debug" directoies, that's OK, but i want static library ie .a files.
Change SHARED to STATIC won't generate …
java-native-interface android cmake static-libraries android-ndk
我想在 R 包中使用libDAI C++库并想要该包:
我当前的设置是:
修改Makevar文件:
# include libraries
PKG_CPPFLAGS =-I../inst/include/
PKG_LIBS = -Llib -l../lib/libdai.a
Run Code Online (Sandbox Code Playgroud)
我用于访问 libDAI 库的脚本是(src/ 中的 test.cpp):
#include <dai/factorgraph.h>
#include <Rcpp.h>
#include <cmath>
using namespace Rcpp;
using namespace std;
using namespace dai;
//'
//' Creates libDAI factor graph object
//'
//' @param factor_graph character definition of the factor graph
//' @export
// [[Rcpp::export]] …Run Code Online (Sandbox Code Playgroud) 我有一个 STM32L0 的 Keil STM32 项目。我有时(比我想要的更频繁)必须更改包含路径或全局定义。这将触发所有代码的完全重新编译,因为它需要 \xe2\x80\x98check\xe2\x80\x99 是否因这些更改而更改了行为。问题是:我没有必要更改 HAL 的相关参数,因此不需要(据我所知)这些文件完全重新编译。重新编译需要相当多的时间,因为我包含了 STM32L0 的所有 HAL 驱动程序。
\n\n一个好的做法是创建一个单独的项目,将 HAL 编译为单个库并将其包含在我的主项目中吗?(当然,这会针对每个微控制器单独完成,因为它们具有不同的 HAL)。
\n\n附:这个问题不一定只对这个特定的例子有用,但这个例子给了这个问题一定的范围。
\n\npps。对于不熟悉 STM32 HAL 的人。它是程序与底层硬件接口的标准化接口。它以.c和.h文件形式提供,而不是 STD/STL 的预编译形式。
更新
\n\n以下是我的示例项目中需要管理的定义的示例:
\n\n\n\n\n\n
STM32L072xx,USE_B_BOARD,USE_HAL_DRIVER, REGION_EU868,DEBUG,TRACE
只有STM32L072xx, 和对于配置 HAL 库很有用,因此当我从定义更改为未定义DEBUG时,我不需要重新编译 HAL 。TRACE因此,在我看来,HAL 可以单独管理。
\n编辑
鉴于投票结果很接近:我已阅读“不要问”部分,我的问题旨在建设性地增加构建 STM32 程序的知识,并找到有关如何更有效地使用 HAL 库的最佳实践。我还没有发现任何关于将 HAL 构建为静态库的问题,因此这个问题至少是唯一的。这个问题也旨在邀请一个丰富的答案,详细说明将 HAL 构建为单独的静态库的优点/缺点。
\n我想在我的 Android Studio 项目中导入以下库,这些库位于/system/lib64/ 文件夹中。 我得到以下错误
2020-01-06 13:23:31.358 5171-5171/org.strongswan.android E/AndroidRuntime: FATAL EXCEPTION: main
Process: org.strongswan.android, PID: 5171
java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib64/libstrongswan.so" needed or dlopened by "/system/lib64/libnativeloader.so" is not accessible for the namespace "classloader-namespace"
at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
at java.lang.System.loadLibrary(System.java:1669)
at org.strongswan.android.logic.CharonVpnService.<init>(CharonVpnService.java:730)
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateService(AppComponentFactory.java:103)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3740)
at android.app.ActivityThread.access$1400(ActivityThread.java:238)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1803)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7073)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
Run Code Online (Sandbox Code Playgroud)
上线System.loadLibrary("strongswan")
System.loadLibrary("strongswan");
if (MainActivity.USE_BYOD)
{
System.loadLibrary("tncif");
System.loadLibrary("tnccs");
System.loadLibrary("imcv");
}
System.loadLibrary("hydra");
System.loadLibrary("charon");
System.loadLibrary("ipsec");
System.loadLibrary("androidbridge"); …Run Code Online (Sandbox Code Playgroud) static-libraries ×10
c++ ×5
android ×2
c ×2
.a ×1
android-ndk ×1
cl.exe ×1
class ×1
cmake ×1
compilation ×1
embedded ×1
java ×1
linker ×1
package ×1
qmake ×1
qt-creator ×1
r ×1
rcpp ×1
stm32 ×1
visual-c++ ×1
windows ×1