在我的应用程序中,我目前将所有代码分成静态库,以便更轻松地为实际应用程序和代码的单元测试设置xcode项目目标.这个问题是我想把我的大部分xib文件放在静态库中,但似乎当我运行我的应用程序并尝试引用xib时它无法找到它,除非它包含在实际中应用程序的目标而不是静态库目标.静态库中是否可以包含xib文件和其他资源,这些文件可以被同一个库中的代码引用,如果是,如何?
我使用code :: blocks来编译我的静态库.输出结果是libstatic.a文件.现在,如何链接到我的库以使用已编译的函数?
(我试图使用#include"libstatic.a",但我的项目没有编译)
我正在尝试将Jnetpcap移植到Android,以便将其用于解析.pcap文件.Jnetpcap是libpcap的java包装器,它使用JNI.我已经使用android的源代码树将libpcap编译为静态库.
当编译Jnetpcap作为共享库时,我遇到错误,因为我必须链接libpcap.a但我不知道怎么能告诉Android.mk他必须链接到我拥有的libpcap.a文件.
使用"LOCAL_STATIC_LIBRARIES:= libpcap"将无法正常工作,因为在android NDK中默认不提供libpcap.
如果你们中的任何人能帮助我,我会非常感激.
这是我当前的Android.mk文件:
include /home/sergio/workspace/MyApp/jni/libpcap/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jnetpcap
LOCAL_SRC_FILES :=\
jnetpcap.cpp\
packet_flow.cpp\
packet_jheader.cpp\
jnetpcap_pcap_header.cpp\
nio_jbuffer.cpp\
winpcap_stat_ex.cpp\
winpcap_send_queue.cpp\
winpcap_ext.cpp\
jnetpcap_ids.cpp\
jnetpcap_dumper.cpp\
jnetpcap_utils.cpp\
util_in_cksum.cpp\
jnetpcap_beta.cpp\
nio_jmemory.cpp\
packet_jsmall_scanner.cpp\
packet_protocol.cpp\
nio_jnumber.cpp\
packet_jheader_scanner.cpp\
library.cpp\
packet_jscan.cpp\
jnetpcap_pcap100.cpp\
util_checksum.cpp\
packet_jpacket.cpp\
winpcap_ids.cpp\
jnetpcap_bpf.cpp
LOCAL_C_INCLUDES := /home/sergio/android-ndk-r5b/platforms/android-8/arch-arm/usr/include /home/sergio/workspace/Shark/jni/libpcap
LOCAL_STATIC_LIBRARIES := libpcap
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud) 我将混合语言框架链接到项目时遇到问题.
1)我使用Swift和Objective-C类创建框架.
2)主逻辑存储在Swift文件中.例如,带有调用NSLog的方法的类("调用Swift日志").
3)Objective-C文件有一个类,它有一个方法,我创建一个Swift类的实例并调用Swift-log方法.
4)我将此框架与我的Objective-C项目相关联,我可以在此项目中调用我需要的所有内容,但是当我想构建此项目时,我收到错误" linker command failed with exit code 1 (use -v to see invocation)"
并警告:
ld: warning: Could not find auto-linked library 'swiftFoundation'
ld: warning: Could not find auto-linked library 'swiftDarwin'
ld: warning: Could not find auto-linked library 'swiftCoreFoundation'
ld: warning: Could not find auto-linked library 'swiftCore'
ld: warning: Could not find auto-linked library 'swiftCoreGraphics'
ld: warning: Could not find auto-linked library 'swiftObjectiveC'
ld: warning: Could not find auto-linked library 'swiftDispatch'
ld: warning: Could not find …
至少在Linux和Solaris上,静态库实际上只是一堆编译好的.o文件被扔进一个大文件中.编译静态库时,通常会忽略-fpic标志,因此生成的代码与位置有关.
现在说我的静态库是B.我已经构建了它并且得到了.a文件,它实际上只是所有位置相关的.o文件的全局.现在我有一个我想构建的共享库,A,我希望它静态链接B.当我构建A时,我自然会使用-fpic标志使生成的代码位置独立.但是,如果我链接B,我不是混合位置依赖和位置独立的目标文件?
除非我还指定-mimpure-text,否则我会收到很多文本重定位错误,我认为这可能是原因.看来,当我编译一个库时,我真的需要编译它3次,共享版本,静态版本和静态 - 可以使用的共享库版本.我对吗?我可以继续使用-mimpure-text,但g ++手册页说如果你这样做,对象实际上并没有最终被共享(不清楚它是否全部未被共享,或者仅仅是静态链接的部分,有人知道吗?) .
我在一个项目中使用CMake,我正试图静态链接一些库.我已经设定:
set(BUILD_SHARED_LIBS OFF)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
set_target_properties(icarus PROPERTIES LINK_SEARCH_END_STATIC 1)
Run Code Online (Sandbox Code Playgroud)
我确定在寻找具有*.a版本的实际库时.
目前该项目进口:
libPocoNet.a
libPocoUtil.a
libPocoXML.a
libPocoFoundation.a
libmysqlclient.a
libmysqlpp.a
libcrypto++.a
CUDA
Run Code Online (Sandbox Code Playgroud)
找到所有库,并且在进行动态/共享链接时,它们工作正常.我也试过设置编译标志:
set(GCC_CXX_FLAGS ${GCC_CXX_FLAGS} "-static-libgcc -static-libstdc++ -static")
Run Code Online (Sandbox Code Playgroud)
但无济于事.虽然我在编译时没有遇到任何问题,但链接会为上面库中的调用抛出大量未定义的引用错误,即:
undefined reference to `mysql_thread_init'
undefined reference to `mysql_real_query'
undefined reference to `pthread_mutex_unlock'
undefined reference to `Poco::ErrorHandler::handle()'
Run Code Online (Sandbox Code Playgroud)
不是那个特定的顺序,每个库都有很多错误.
看看海湾合作委员会的最后一行,我看到:
/usr/bin/c++ -g -g -static-libgcc -static-libstdc++ -static [list of *.cpp files]
-o icarus -rdynamic /usr/local/lib/libPocoFoundation.a /usr/local/lib/libPocoNet.a
/usr/local/lib/libPocoUtil.a /usr/local/lib/libPocoXML.a
-Wl,-Bstatic -lmysqlclient -lmysqlpp -lcrypto++
Run Code Online (Sandbox Code Playgroud)
这让我想知道:
那么,有人可以向我解释一下:
如果那些问题太多或过于局部化,请原谅我,我之前没有尝试过,而且我似乎无法在网上找到太多信息.
我一直在更新一个静态库来支持bitcode,从我的研究中我发现了两种实现方法:
这两个选项有什么区别吗?
我注意到的唯一区别是,通过使用fembed-bitcode,生成的iphonesimulator静态库将在启用完全bitcode的情况下构建(在我的情况下,二进制大小从5MB变为13MB,我可以检查bitcode支持使用otool),这看起来似乎不大使用它有任何不同.
在以下示例中,程序应打印"foo called":
// foo.c
#include <stdio.h>
__attribute__((constructor)) void foo()
{
printf("foo called\n");
}
// main.c
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果程序是这样编译的,它可以工作:
gcc -o test main.c foo.c
Run Code Online (Sandbox Code Playgroud)
但是,如果将foo.c编译为静态库,则程序不会打印任何内容.
gcc -c main.c
gcc -c foo.c
as rcs foo.a foo.o
gcc -o test foo.a main.o
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我有一组静态库(.lib)文件,其中一个文件可能是使用不同版本的Visual Studio构建的.这导致链接所有这些项目的项目的代码生成失败.有没有办法确定使用哪个版本的Visual Studio来编译静态库?
嘿,我正在学习Haskell,我有兴趣用它来制作静态库,可以在Python和C中使用.经过一些谷歌搜索我发现如何让GHC输出一个共享对象,但它动态地依赖于GHC`的图书馆.在GHC中编译得到的ELF是动态依赖的,并且只依赖于C libs,并且它的大小在MB之下 - 它与GHC的libs静态链接.如何以及是否可以实现共享对象?
当前状态示例:
$ ghc --make -dynamic -shared -fPIC foo.hs -o libfoo.so
$ ldd libfoo.so
linux-vdso.so.1 => (0x00007fff125ff000)
libHSbase-4.2.0.2-ghc6.12.3.so => /usr/lib/ghc-6.12.3/base-4.2.0.2/libHSbase-4.2.0.2-ghc6.12.3.so (0x00007f7d5fcbe000)
libHSinteger-gmp-0.2.0.1-ghc6.12.3.so => /usr/lib/ghc-6.12.3/integer-gmp-0.2.0.1/libHSinteger-gmp-0.2.0.1-ghc6.12.3.so (0x00007f7d5faac000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f7d5f816000)
libHSghc-prim-0.2.0.0-ghc6.12.3.so => /usr/lib/ghc-6.12.3/ghc-prim-0.2.0.0/libHSghc-prim-0.2.0.0-ghc6.12.3.so (0x00007f7d5f591000)
libHSffi-ghc6.12.3.so => /usr/lib/ghc-6.12.3/libHSffi-ghc6.12.3.so (0x00007f7d5f383000)
libc.so.6 => /lib/libc.so.6 (0x00007f7d5f022000)
/lib/ld-linux-x86-64.so.2 (0x00007f7d60661000)
$ ghc foo.hs
$ ldd foo
linux-vdso.so.1 => (0x00007fff2d3ff000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f50014ec000)
libm.so.6 => /lib/libm.so.6 (0x00007f5001269000)
librt.so.1 => /lib/librt.so.1 (0x00007f5001061000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f5000e5d000)
libc.so.6 => /lib/libc.so.6 (0x00007f5000afc000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f50008df000)
/lib/ld-linux-x86-64.so.2 …Run Code Online (Sandbox Code Playgroud) static-libraries ×10
c ×3
linker ×3
objective-c ×2
android ×1
android-ndk ×1
attributes ×1
bitcode ×1
build ×1
cmake ×1
compilation ×1
constructor ×1
fpic ×1
gcc ×1
ghc ×1
haskell ×1
ios ×1
iphone ×1
swift ×1
xib ×1