我创建了一个系统,它根据全局实例的构造函数自动将函数对象(仿函数)注册到映射中.
在定义仿函数的每个cpp文件中,有一个注册器类实例的全局实例,用于将仿函数注册到单个std::map<int, std::function<...> >对象.
这是注册商类的定义:
template
<
typename map_type,
typename handler_type
>
struct registrar
{
registrar
(
map_type& map_object,
boost::uint16_t cmd_code,
const handler_type& handler
)
{
map_object.insert(std::pair<boost::uint16_t, handler_type>(cmd_code, handler));
}
};
Run Code Online (Sandbox Code Playgroud)
在每个.cpp文件中.全局实例定义如下:
namespace one_way
{
static registrar <in_out_map_type, handler>
post_receiver(in_out_map_type::instance(), command, handlers());
}
Run Code Online (Sandbox Code Playgroud)
如果我将所有cpp与main.cpp一起编译,那么一切正常.但是如果我将cpp文件编译成静态库并将其链接到main.cpp,则注册不起作用.
我在Windows和Ubuntu 11.10上使用VC10和GCC4.61进行了测试.两者都失败了
我发现一个线程有同样的问题,但OP没有说是否解决了.
我错过了什么吗?
编辑
感谢所有回复,包括评论.
每一个回复确实帮助我更多地思考并深入研究这种方法.经过所有的研究和试验,我终于放弃了依赖全局/静态变量进行二元边界自注册的想法,因为没有可靠的方法来保证它能够正常工作.
我最后的方法是将注册保持在一个二进制文件中.
c++ initialization global-variables static-libraries static-linking
最近我开始为一个旧的静态库编写测试用例.我已将库加载到Xcode 5,由于静态库已旧,我必须手动添加TestProject和Test Target.
当我尝试"产品 - >测试"时,它启动模拟器,控制台显示以下错误
无法加载/xxx/xxx/xxx/StaticLibTest.xctest中的测试包,因为发生了意外错误:Error Domain = NSCocoaErrorDomain Code = 3587"无法加载软件包"StaticLibTest.xctest",因为它已损坏或丢失必要的资源." (dlopen_preflight(/xxx/xxxx/xxx/Debug-iphonesimulator/StaticLibTest.xctest/StaticLibTests):找不到合适的图像.找到了:
我不知道为什么会出现这个错误.
任何指出正确方向的帮助都将非常感激.
我有一个Xcode项目,它生成一个静态库.我的团队计划在Swift中进行所有新开发.无法将Swift文件添加到静态库项目中.我们正在放弃对iOS 7的支持,因此现在可以在我们的iOS应用程序中包含框架.因此,我打算将我的静态库项目转换为框架项目.
我看过,但我找不到任何有关如何执行此转换的工具或建议.静态库很大(超过100个.m文件).
我希望得到一个更好的答案,而不是创建一个新的并行框架目标.我试过两次.第一次作为一个快速的目标,但我无法轻松导入所有的Objective C文件.接下来,作为Objective C目标,但不再有.pch.
对不起!我搜索了很多,但找不到答案!我知道这是愚蠢的.
我无法在eclipse cdt中链接静态库(*.a).我在项目 - >设置 - > GCC C++链接器 - >库中列出了它们.我使用绝对路径来确保我的lib正确...我得到:
找不到-l/usr/local/lib/libboost_date_time.a
无论我做错什么,我都确定这是愚蠢的:(
编辑 - 我应该提到我在运行时链接库...
它是一种使用静态lib函数的方法,如果我没有头文件,只有*.a文件,但我知道函数签名?
我正在尝试在Xcode中创建一个C++库,我不确定是选择C/C++库还是STL C++库选项?我注意到该STL C++ Library选项不允许您创建静态库并强制您创建动态库.但是,C/C++ Library除了创建静态库之外,该选项还允许您创建动态库.
这两个选项之间的区别是什么?我应该在何时使用它们?我阅读了选项下面的描述,但不幸的是它们并没有非常有用.
另外,为什么静态库文件与动态库文件完全不同?似乎差异主要在于如何找到库(与您的应用程序一起打包而不是依赖于目标计算机上的状态),而不是在库本身的功能或代码中.如果有人能澄清这一点,那就太棒了.


我正在构建一个静态库,以便分发给其他iOS开发人员,并且在配置链接器以允许静态库在另一个应用程序中使用时遇到一些麻烦.我已经使用本指南创建了一个MyStaticLibrary.framework包,其中包含lib本身以及其他资源(如图像).这构建成功并使用cocoapods来获取所需的依赖项(AFNetworking等).到现在为止还挺好.
但是当我将MyStaticLibrary.framework导入到一个新的Xcode项目中以测试使用该库构建应用程序时,我得到了大量的链接器错误(架构i386的未定义符号,_ OBJC_CLASS _ $ _ CLASSNAME),表明我在这里做了一些非常错误的事情.
所以我的问题是,如何使用源自cocoapods的依赖项构建MyStaticLibrary.framework,这样我可以为第三方提供我的框架文件并允许它们访问公共头文件中指定的所有函数?
我正在尝试使用MSVC(VS 2010)在Windows 7中构建boost库.
我在bjam命令行选项中遇到了选项运行时链接和链接.我想知道它们是如何使用的,它们之间的确切区别是什么.
我使用此命令行构建了Boost Regex库
bjam --with-regex variant = release --build-options = complete
它产生了这些文件:
1)boost_regex-vc100-mt-1_47.dll(导入库:boost_regex-vc100-mt-1_47.lib)
2)libboost_regex-VC100-MT-1_47.lib
3)libboost_regex-VC100-MT-S-1_47.lib
4)libboost_regex-VC100-S-1_47.lib
2和3 .lib文件有什么区别?它们都是静态库.我已经阅读了Boost文档,但没有找到太多解释.
TIA
这是一个概述我的问题的最小例子
test.c的:
#include <stdio.h>
#include <math.h>
main ()
{
fmod ( 3, 2 );
}
Run Code Online (Sandbox Code Playgroud)
这是我要编译的命令 test.c
gcc -lm test.c -o test
Run Code Online (Sandbox Code Playgroud)
这是我发出上述命令时得到的输出
/tmp/ccQmRk99.o: In function `main':
test.c:(.text+0x3e): undefined reference to `fmod'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
如果相反,我会使用相同的输出cc.我使用的是以下版本的gcc
gcc-4.6.real (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Run Code Online (Sandbox Code Playgroud)
我的程序无法编译的任何想法?
我相当熟悉Windows和Linux库的编译但今天当我看到MinGW我的Windows机器上抛出了dll.a和.a 文件的OpenCV编译后我开始认真地开始思考.
这些是我\lib从OpenCV编译的输出:
2012-12-21 23:35 1 338 420 libopencv_core243.dll.a
2012-12-21 23:33 224 994 libopencv_core_pch_dephelp.a
2012-12-21 23:38 830 820 libopencv_features2d243.dll.a
Run Code Online (Sandbox Code Playgroud)
我的\bin输出:
2012-12-21 23:40 356 178 libopencv_perf_core.dll.a
2012-12-21 23:45 362 702 libopencv_perf_features2d.dll.a
2012-12-21 23:35 4 086 052 libopencv_core243.dll
2012-12-21 23:38 2 102 896 libopencv_features2d243.dll
Run Code Online (Sandbox Code Playgroud)
(我显然有更多的二进制文件,但在这里列出它是没有意义的)
有人能告诉我这些是否是我可以链接的普通静态库?我应该如何与他们联系?