我正在尝试使用gnatmake将第三部分库编译到我现有的应用程序中.我收到此错误:
gnatmake: "dds.adb" not found
gnatmake: "dds-domainparticipant.adb" not found
gnatmake: "dds-domainparticipantfactory.adb" not found
gnatmake: "dds-publisher.adb" not found
gnatmake: "dds-topic.adb" not found
gnatmake: "dds-publisher_impl.adb" not found
gnatmake: "dds-datawriter_impl.adb" not found
gnatmake: "dds-domainparticipant_impl.adb" not found
gnatmake: "dds-readcondition_impl.adb" not found
gnatmake: "dds-datareader_impl.adb" not found
gnatmake: "dds-subscriber.adb" not found
gnatmake: "dds-condition.adb" not found
gnatmake: "dds-datareader.adb" not found
gnatmake: "dds-statuscondition.adb" not found
Run Code Online (Sandbox Code Playgroud)
我将这些添加到构建adp的gnatmake中.-I包含所有规范(.ads文件),libnddsadad包含所有o文件:
-I/lib/ndds.4.5d/include/ndds/dds_ada \
-I/lib/ndds.4.5d/include/ndds/dds_ada/support \
-I/lib/ndds.4.5d/include/ndds/dds_ada/support/low-level \
/lib/Linux/ndds.4.5d/lib/GNATgcc/static/debug/libnddsadad.a \
Run Code Online (Sandbox Code Playgroud)
任何想法为什么它想要实际的身体文件?规格+ .a文件不应该足够吗?我怎么能绕过这个呢?
我不想编译动态库,所以这个问题没用.
我下载了taglib并使用以下方法编译它:
cmake -DENABLE_STATIC=ON -DENABLE_STATIC_RUNTIME=ON -DWITH_MP4=ON -G "Visual Studio 10"
Run Code Online (Sandbox Code Playgroud)
这会生成Visual Studio解决方案,我可以编译"tag"项目,该项目在taglib/Release中生成tag.lib.
当我尝试在测试应用程序中使用库时出现问题 - 没什么,只是一个简单的测试:
#include "stdafx.h"
#include "fileref.h"
int _tmain(int argc, _TCHAR* argv[])
{
TagLib::FileRef d("");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下链接器错误:
Error 1 error LNK2001: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall TagLib::FileRef::~FileRef(void)" (__imp_??1FileRef@TagLib@@UAE@XZ) C:\...\taglib_test\taglib_test\taglib_test.obj taglib_test
Error 2 error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall TagLib::FileRef::FileRef(class TagLib::FileName,bool,enum TagLib::AudioProperties::ReadStyle)" (__imp_??0FileRef@TagLib@@QAE@VFileName@1@_NW4ReadStyle@AudioProperties@1@@Z) C:\...\taglib_test\taglib_test\taglib_test.obj taglib_test
Error 4 error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall TagLib::FileName::FileName(char const *)" (__imp_??0FileName@TagLib@@QAE@PBD@Z) C:\...\taglib_test\taglib_test\taglib_test.obj taglib_test …Run Code Online (Sandbox Code Playgroud) 我正在创建一个应用程序,它支持在运行时动态加载的dll形式的模块.代码按以下方式排列:
核心 - 静态库
这有一种加载共享库并调用"create"函数的机制,该函数返回一个新的Module对象(使用共享头).
模块共享库(链接到核心静态库)
此模块使用共享模块头,并使用核心库中的其他类(因此它与核心库链接的原因).它构建为包含静态库中的所有符号.
测试应用程序可执行文件(链接核心静态库)
我变得时髦,看似零星的行为.它们总是在访问冲突中结束,但似乎我非常明确地设置的成员变量(整数)将在后面的函数中打印出来作为垃圾(我已经证实它们之前没有被删除).如果它们加载动态库(即使我从不调用create函数),这似乎只会发生.
我的主要问题是,这里存在危险吗,共享库中的符号会与可执行文件中的符号冲突(因为它们来自同一个静态库)并导致问题,即使它们来自完全相同的静态库?
没有RTOS/OS的小型嵌入式系统是否使用动态/共享库.我的理解是,使用它非常困难,而且效率不高.
如果我们多次调用一个静态库中存在的API.API代码是否会放置在每个调用位置,如宏扩展或代码/文本将是所有调用的通用位置.我认为代码/文本很常见.
如果我为具有多个API的.c文件创建了静态库,并且我将其与主文件静态链接,并且在主文件中只调用了一个API,那么我的问题是整个库是否包含在最终的.bin中或仅特定的API代码.
从上面的问题,你可以假设我缺少基本面本身,所以任何人都可以提供相关的链接来刷这些.
问候
[编辑]
我试过以下事情
addition.c模块
`int addition(int a,int b)`
`{`
`int result;`
`result = a + b;`
`return result;`
`}`
`size addition.o`
23 0 0 23 17 addition.o
Run Code Online (Sandbox Code Playgroud)
multiplication.c模块
`int multiplication(int a, int b)`
`{`
`int result;`
`result = a * b;`
`return result;`
`}`
`size multiplication.o`
21 0 0 21 15 multiplication.o
Run Code Online (Sandbox Code Playgroud)
创建了两者的目标文件并放入了archieve
ar cr libarith.a addition.o multiplication.o
Run Code Online (Sandbox Code Playgroud)
然后静态链接到我的主应用程序
example.c模块
`#include "header.h"`
`#include <stdio.h>`
`1:int main()`
`2:{`
`3:int result;`
`4:result = addition(1,2);`
`5:printf("addition result is : …Run Code Online (Sandbox Code Playgroud) 这是一个相当简单的应用程序的设置,我无法正确链接.基本上是单个源文件main.cpp,带有静态库的目录libbreakpad_client.a,以及库中的标头breakpad.
$ ls .
main.cpp libs breakpad
$ ls libs
libbreakpad_client.a
Run Code Online (Sandbox Code Playgroud)
以下是Google Breakpad文档中main.cpp逐字记录的来源.
#include "client/linux/handler/exception_handler.h"
void crash()
{
volatile int* a = (int*)(NULL);
*a = 1;
}
static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded)
{
printf("Dump path: %s\n", descriptor.path());
return succeeded;
}
int main()
{
google_breakpad::MinidumpDescriptor descriptor("/tmp");
google_breakpad::ExceptionHandler eh(descriptor, 0, dumpCallback, 0, true, -1);
crash();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译它时,链接器抱怨它无法找到ExceptionHandler构造函数和析构函数.
$ g++ -Ibreakpad/src -lbreakpad_client -Llibs -o main main.cpp …Run Code Online (Sandbox Code Playgroud) 我能够为我的Objective-C静态库成功创建dll文件.但是当我尝试从Xamarin.iOS应用程序和编译中引用该dll时,它给了我很多错误,比如......
错误MT5210:本机链接失败,未定义符号:_AudioFileClose.请验证是否已引用所有必需的框架并且本机库已正确链接.(MT5210)
错误MT5210:本机链接失败,未定义符号:std :: ios_base :: Init :: Init().请验证是否已引用所有必需的框架并且本机库已正确链接.(MT5210)
错误MT5202:本机链接失败.请查看构建日志.(MT5202)
在此之后,我尝试使用Addtional mtouch Arguments链接我的.a库.添加这些参数后,我收到了新的错误.
无法解析命令行参数:无法捆绑未注册的选项'-o'.
有人可以帮我解决这个问题.
根据http://guides.cocoapods.org/terminal/commands.html#pod_install,如果要自己集成库或外部依赖项,可以使用-no-integrate选项.
基本上我有我的静态库(comms.a)和头文件(comms.h).我的应用程序将导入此库以进行服务器通信.我的应用程序没有使用cocoapods进行集成.(从xcode手动链接).
但我的静态库具有以下结构.
- Comms (main target) [Dependency on AFNetworking using cocoapods]
- CommsTest (test case target) [Dependency on GHUnit using cocoapods]
Run Code Online (Sandbox Code Playgroud)
什么应该是我的podfile,以便它将获取AFNetworking但集成取决于我并获取GHUnit并集成到我的测试用例目标.
注意:我不希望我的静态库使用cocoapods集成到我的应用程序中.
我正在尝试将GLEW库链接到Xcode项目,但是我一直遇到问题。每当我将构建设置为与libGLEW.a链接时,启动时我都会立即崩溃,并显示以下错误输出:
yld:未加载库:/usr/lib/libGLEW.1.12.0.dylib引用自:/Users/xxx/Library/Developer/Xcode/DerivedData/xcode-test/Products/Debug/manualWindow.app/Contents/MacOS/ manualWindow原因:找不到图片
我没有编写任何代码来请求我的应用程序加载此动态库。这种现象似乎是我的GLEW库实际上是一个导入库,并且正在尝试加载dylib。我确实自己构建了GLEW,并且可以在生成静态库的对象时在命令行上指定“ -DGLEW_STATIC”。
有人知道我怎么能知道我的GLEW库(libGLEW.a)实际上是dylib的导入库吗?作为后续,如何正确构建库以避免这种情况?
为什么Swift不支持静态库?
我看到了这个解释,但我不明白这个推理.
当前运行时不附带操作系统,因此静态库将导致最终可执行文件中的多个运行时.对于与较新的OS或Swift的兼容性,静态链接的运行时将更难以修补....运行时间不断变化.我们需要动态链接它以便能够处理未来的前向部署问题. - 乔格罗夫
https://twitter.com/owensd/status/555060783407591424
请解释.
对于这个肯定会被问到并回答过的非常基本的问题,我也深表歉意。我搜索了一个答案,但是找不到任何有用的东西。我正在使用VS 2017社区的最新更新,并且试图将我以前称为“函数库”的内容手动添加到位于“解决方案”下的项目中。
该项目只是一个C ++或C#控制台应用程序。我所拥有的是.h(头)文件,.lib(静态库)文件和.dll(动态库)文件。我打算对该库进行“函数调用”。我知道我需要将dll保存在可执行文件所在的调试文件夹中,但是我不确定如何在VS 2017中“添加依赖项”。我知道如何管理和安装NuGet软件包,但是这些文件不是不是一个方便的NuGet软件包。
我希望能以正确的方式(VS 2017)获得建议。