我有一个C++项目,由于其目录结构被设置为静态库A,它链接到共享库B,它链接到可执行文件C.(这是使用CMake的一个跨平台的项目,所以在Windows上我们得到的A.lib,B.dll和C.exe,和在Linux上我们得到的libA.a,libB.so和C).图书馆A有一个初始化函数(A_init在定义A/initA.cpp),即从库调用B的初始化函数(B_init,定义于B/initB.cpp),从C主要调用.因此,当链接时B,A_init(和所有符号中定义的initA.cpp)被链接到B(这是我们期望的行为).
问题在于,A库还定义了一个动态加载的函数(Af,在A/Afort.f其中定义)(即LoadLibrary/ GetProcAddress在Windows上和dlopen/ dlsym在Linux上).由于没有Af来自库的引用B,A/Afort.o因此不包括符号B.在Windows上,我们可以通过使用pragma人工创建引用:
#pragma comment (linker, "/export:_Af")
Run Code Online (Sandbox Code Playgroud)
由于这是一个pragma,它只适用于Windows(使用Visual Studio 2008).为了让它在Linux上运行,我们尝试将以下内容添加到A/initA.cpp:
extern void Af(void);
static void (*Af_fp)(void) = …Run Code Online (Sandbox Code Playgroud) 我有一个静态库A和一个动态库B,链接到A(在 LinuxA/libA.a和上B/libB.so,在 WindowsA/A.lib和上B/B.dll)。在 Linux 上,我可以使用以下链接行B包含所有符号:A
g++ -shared -o libB.so B_init.o ... -Wl,--whole-archive -L../A -lA -Wl,--no-whole-archive
Run Code Online (Sandbox Code Playgroud)
我该如何在 Windows 上执行相同的操作?(假设我已正确导出带有A正确__declspec(dllexport)装饰的符号。)
给出以下XML文档:
<Include>
<Feature Title="A">
<Feature Title="1" />
<Feature Title="2" />
</Feature>
<Feature Title="B">
<Feature Title="3">
<Feature Title="i" />
<Feature Title="ii" />
</Feature>
<Feature Title="4" />
</Feature>
</Include>
Run Code Online (Sandbox Code Playgroud)
我需要生成一个看起来像这样的文本文件:
; Header
A
A/1
A/2
B
B/3
B/3/i
B/3/ii
B/4
Run Code Online (Sandbox Code Playgroud)
我实现这一目标的最佳尝试是XSL样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:text>; Header


</xsl:text>
<xsl:apply-templates select="//Feature" /></xsl:template>
<xsl:template match="Feature">
<xsl:value-of select="@Title" /><xsl:text>

</xsl:text>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
但这是产生输出:
; Header
A
1
2
B
3
i
ii
4
Run Code Online (Sandbox Code Playgroud)
如何在输出中显示所有级别的层次结构?